使用 luatex 从原始 unicode 输出梵文(印地语)

使用 luatex 从原始 unicode 输出梵文(印地语)

我可以使用 luatex 编译以下代码,并在 pdf 中正确打印印地语/天城文字符:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\newfontscript{Devanagari}{deva,dev2}
\newfontface{\hindi}[Script=Devanagari]{Lohit-Devanagari.ttf}

\begin{document}
Here is normal text.
{\hindi नमस्ते }
\end{document} 

但是,我正在使用一个输出 tex 的程序,它不允许我在 tex 编辑器中输入印地语脚本;相反,它只会给我单词“नमस्ते”的 unicode 版本,即"<U+0928><U+092E><U+0938><U+094D><U+0924><U+0947>"

如何让 luatex 从这些原始代码字符中正确编译?我想要编译的内容(生成一个只有一个单词“नमस्ते”的 PDF)是这样的:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\newfontscript{Devanagari}{deva,dev2}
\newfontface{\hindi}[Script=Devanagari]{Lohit-Devanagari.ttf}

\begin{document}
Here is normal text.
{\hindi <U+0928><U+092E><U+0938><U+094D><U+0924><U+0947> }
\end{document} 

...但那不管用。

答案1

[(i) 在 Lua 函数 'conv' 中添加了一个额外操作来处理 OP 的后续请求。 (ii) 实现了 Ulrike Fischer 的建议,使用^^^^符号来排版 4 字节字符。]

由于您使用的是 LuaLaTeX,因此这里有一个解决方案,它使用 Lua 函数将格式为 的字符串转换'<U%+(.-)>''^^^^%1';这里,%+表示文字字符+%1表示非贪婪模式的捕获(.-)>——换句话说:“0 个或多个任何类型的字符,最多但不包括>”。 Lua 函数会小心地附加{}到每个转换后的数字;如果输入字符串包含空格,这一点很重要。

此外,代码还设置了一个 LaTeX 宏,作为 Lua 函数的前端。因此,可以通过指令调用 Lua 函数\conv{<your string here>}

您可以手动将 unicode 代码序列装入\conv{...}语句中,或者根据脚本程序为您完成工作的程度,指示程序\conv{...}自动将 unicode 代码序列装入语句中。

在此处输入图片描述

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\newfontscript{Devanagari}{deva,dev2}
\newfontface{\hindi}[Script=Devanagari]{Lohit-Devanagari.ttf}

%%%% -- copy the next eight lines of code to your document -- 
\usepackage{luacode} % for 'luacode' env. and '\luastringN' macro
\begin{luacode}
function conv ( s ) 
   s = s:gsub ( '<U%+(.-)>' , function ( x )
                   return '^^^^'..string.lower(x)..'{}' 
                   end ) 
   tex.sprint ( s )
end
\end{luacode}
\newcommand\conv[1]{\directlua{conv(\luastringN{#1})}}

\begin{document}
Latin-alphabet text.

{\hindi नमस्ते }

{\hindi \conv{<U+0928><U+092E><U+0938><U+094D><U+0924><U+0947>} }

{\hindi \conv{<U+0928><U+092E><U+0938><U+094D><U+0924><U+0947> <U+0930><U+093E><U+091C>}}
\end{document} 

相关内容