我可以使用 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}