如何通过Lua(La)TeX编译的lua代码将特定的unicode字符(例如ZWNJ符号)插入到文本流中?

如何通过Lua(La)TeX编译的lua代码将特定的unicode字符(例如ZWNJ符号)插入到文本流中?

如何指示 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}

相关内容