使用 fontspec 和 polyglossia 时 lualatex 中的字体问题

使用 fontspec 和 polyglossia 时 lualatex 中的字体问题

我正在尝试使用 lualatex 排版包含印地语和英语的文档。以下 MWE 有效:

\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage{hindi}
\setotherlanguage{english}
\usepackage{fontspec}
\newfontscript{Devanagari}{deva,dev2}
\newfontfamily{\devanagarifont}{Noto Serif Devanagari}[Scale=1.1,Script=Devanagari]
\newfontfamily{\englishfont}{Noto Serif}
\begin{document}
 
This is a test.
 
 यह एक परीक्षा है।
\end{document} 

并给出正确的输出。

在此处输入图片描述

但是,如果我将默认语言更改为英语,将另一种语言更改为印地语,如下面的 MWE 所示

\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage{english}
\setotherlanguage{hindi}
\usepackage{fontspec}
\newfontscript{Devanagari}{deva,dev2}
\newfontfamily{\devanagarifont}{Noto Serif Devanagari}[Scale=1.1,Script=Devanagari]
\newfontfamily{\englishfont}{Noto Serif}
\begin{document}
 
This is a test.
 
 यह एक परीक्षा है।
\end{document} 

印地语字符不显示。问题是什么? 在此处输入图片描述

答案1

Polyglossia 不会自动检测语言。(Babel 有一个命令可以做到这一点。)您需要使用 或 来选择它\texthindi\textenglish碰巧您的 Hindi 字体也支持英语,因此将其用作默认字体恰好有效。如果您检查字体,您会发现它只使用您的 Devanagari 字体,而不是您指定的英语字体。

如果您要切换语言,则应在源顶部附近添加命令:

\tracinglostchars=3

这样,请求当前字体没有的字形时就会出错,而不是默默忽略它(在文件中间显示一条消息.log)。您可以使用 将其转换为控制台上的警告\tracinglostchars=2

以下使用 Babel 的解决方案将主要语言设置为英语,并自动检测您输入的语言:

\documentclass{article}
\tracinglostchars=3
\usepackage[english, bidi=basic]{babel}
\usepackage{fontspec}

\babelprovide[import=hi, onchar=fonts ids]{hindi}

\babelfont{rm}
          [Ligatures={Common, TeX}]{Noto Serif}
\babelfont[hindi]{rm}
          [Scale=MatchUppercase]{Noto Serif Devanagari}

\begin{document}

This is a test.
 
यह एक परीक्षा है।
\end{document}

Noto Serif 样本

如果您现有的源使用诸如\texthindi或 之类的命令\textdevanagari,您可能还需要声明\babeltags与 Polyglossia 兼容。

相关内容