如何指示 Lua(La)TeX(具体来说,通过指令调用的 lua 代码\directlua
)将非 ASCII unicode 符号(例如“零宽度非连接符”符号(代码 U+200C))插入文本流?我已经知道如何在 (Lua)LaTeX 文档主体中执行此操作 - 我会输入类似
stuff\char"200C{}morestuff
但是如何从 lua 代码内部做到这一点?
附录(希望……)澄清我想要完成的工作。如果输入流中有一个字符串,例如xyz123
,我想在xyz
和之间插入一个特定字符(这个邪恶的隐形 ZWNJ 字符……) 123
,这样输入流现在就是
xyz<ZWNJ>123
我已经有了代码来 (i)xyz123
在输入流中查找 的所有实例,以及 (ii) 在字符串 中找到 ZWNJ 字符的插入点xyz123
。我所坚持的是试图弄清楚如何在插入位置插入 ZWNJ 字符(luatex 中的“节点”?什么类型的?)。
答案1
在 luatex 中,包含 unicode 库。它充当字符串库的替代品,因此要打印一些 unicode 代码点,可以使用 char 函数:
function unicode2utf(c)
-- As parameter pass hexadecimal unicode code point
return unicode.utf8.char(tonumber(c,16))
end
print(unicode2utf("038F"))
这将打印欧米茄符号,因为不可见的空间不是最好的测试字符:)
答案2
参数在传递给 lua 之前由 TeX 处理,因此您可以使用
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Arial}
\begin{document}
\showoutput
z^^^^200cZ
\directlua{tex.sprint("a^^^^200cbc")}
\end{document}
这使得
....\EU2/Arial(0)/m/n/10 a
....\EU2/Arial(0)/m/n/10
....\EU2/Arial(0)/m/n/10 b
....\EU2/Arial(0)/m/n/10 c
在 a 和 b 之间显示一个不可见字符
如果 tex.print 位于通过以下方式访问的外部文件中,这也有效
\directlua{require('\jobname.lua') }
但在外部文件中
tex.sprint("x^^^^200cyz")
lua 字符串有 11 个字符(字节),该^^^^
符号仅由 TeX 解释,因为它解析输出tex.print
如果你需要字符可用于 lua 函数而不是仅仅用于 tex 输出,那么你需要构建它的 utf8 编码,我认为(稍后更新)
如果你需要 lua 字符串中的字符,那么你可以使用string.char
其 utf8 编码
\jobname.lua
tex.sprint("x^^^^200cyz")
zwnj=string.char(226,128,140)
tex.sprint("v")
tex.sprint(zwnj)
tex.sprint("w")
test.tex
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Arial}
\begin{document}
\showoutput
z^^^^200cZ
\directlua{tex.sprint("a^^^^200cbc")}
\directlua{require('\jobname.lua') }
\end{document}