考虑这些 MWE。
\documentclass{article}
\usepackage[english]{babel}
\babelprovide[onchar=ids fonts]{english}
\babelprovide[main,import]{thai}
\usepackage{fontspec}
% \babelfont[thai]{rm}[
% Script=Thai,
% UprightFont = *.otf,
% BoldFont = *-Bold.otf,
% ItalicFont = *-Italic.otf,
% BoldItalicFont = *-BoldItalic.otf]
% {Laksaman}
\babelfont[thai]{rm}{FreeSerif}
\babelfont[thai]{sf}[
Script=Thai,
UprightFont = *.otf,
BoldFont = *-Bold.otf,
ItalicFont = *-Italic.otf,
BoldItalicFont = *-BoldItalic.otf]
{Laksaman}
\begin{document}
ข้อความทดสอบ Test text.
\textsf{ข้อความทดสอบ Test text.}
\end{document}
然而,当我将泰语的衬线字体改为与无衬线字体(Laksaman)相同时,此代码的产物被格式化错误的。(最后一个测试文本的样式是衬线,而不是无衬线)
\documentclass{article}
\usepackage[english]{babel}
\babelprovide[onchar=ids fonts]{english}
\babelprovide[main,import]{thai}
\usepackage{fontspec}
\babelfont[thai]{rm}[
Script=Thai,
UprightFont = *.otf,
BoldFont = *-Bold.otf,
ItalicFont = *-Italic.otf,
BoldItalicFont = *-BoldItalic.otf]
{Laksaman}
% \babelfont[thai]{rm}{FreeSerif}
\babelfont[thai]{sf}[
Script=Thai,
UprightFont = *.otf,
BoldFont = *-Bold.otf,
ItalicFont = *-Italic.otf,
BoldItalicFont = *-BoldItalic.otf]
{Laksaman}
\begin{document}
ข้อความทดสอบ Test text.
\textsf{ข้อความทดสอบ Test text.}
\end{document}
那么,有人能向我解释一下这里发生了什么吗?提前谢谢!
答案1
Babel
尝试根据字体名称猜测系列。如果有两个系列或两个字体具有相同的名称,就会产生混淆。我必须研究如何处理这些情况。一种 hack 解决方法是复制并重命名字体文件(例如Laksaman-Bold.otf
→ LaksamanSF-Bold.otf
)并使用 Harfbuzz 渲染器(默认渲染器会引发 lua 错误):
\babelfont[thai]{sf}[
Script=Thai, % Very likely redundant
Renderer=Harfbuzz,
UprightFont = *.otf,
BoldFont = *-Bold.otf,
ItalicFont = *-Italic.otf,
BoldItalicFont = *-BoldItalic.otf]
{LaksamanSF} % The new name
编辑[原始答案的一部分如下,这并不正确。]但是,有一个简单的解决方案:按以下方式设置不同的 NFSS 名称:
\babelfont[thai]{sf}[
Script=Thai,
NFSSFamily=LaksamanSF,
UprightFont = *.otf,
BoldFont = *-Bold.otf,
ItalicFont = *-Italic.otf,
BoldItalicFont = *-BoldItalic.otf]
{Laksaman}