我有这个例子
\documentclass[hyperref=unicode]{beamer}
\usepackage[english,nil,bidi=basic-r]{babel}
\babelprovide[import=ar-DZ, main]{arabic}
\babelfont{rm}{Amiri}
\babelfont{sf}{Amiri}
\begin{document}
\begin{frame}{}
\today
\end{frame}
\begin{frame}{}
\selectlanguage{english}
\today
\end{frame}
\end{document}
编译时lualatex
我收到此警告
软件包 fontspec 警告:字体‘Amiri’不支持‘英语’语言
我做错了什么?或者我错过了什么?
答案1
这也困扰了我很长时间。事情是这样的:
这些是阿米里:
DFLT Default
arab Arabic
arab.ARA Arabic/Arabic
arab.KSH Arabic/Kashmiri
arab.SND Arabic/Sindhi
arab.URD Arabic/Urdu
latn Latin
latn.TRK Latin/Turkish
当您加载阿拉伯语时\babelprovide[import=ar-DZ, main]{arabic}
,babel
就会读入babel-ar-DZ.ini
。
在此文件中,您将发现(除其他外):
tag.opentype = ARA
script.tag.opentype = arab
因此,当使用阿尔及利亚阿拉伯语时,babel
将加载阿米里带有arab.ARA
脚本和语言。这存在于字体中,所以一切都很好。
但babel-en.ini
包含这个:
tag.opentype = ENG
script.tag.opentype = latn
因此,当使用英语时,babel
将尝试加载阿米里包含latn.ENG
脚本和语言。但字体中不存在此组合,因此会发出警告babel
:
Language 'English' not available for font 'Amiri' with script 'Latin'.
现在我们需要做的就是告诉babel
使用Language=Default
withScript=Latin
表示英语,同时继续使用Language=Arabic
withScript=Arabic
表示阿尔及利亚阿拉伯语。
为此,请english
从主babel
选项中删除它,然后像这样加载它:
\babelprovide[import,language=Default]{english}
笔记: babel
与使用language
小写字母l
相反,fontspec
使用Language
!
babel
现在将加载阿米里支持英语文本选项,且不会发出警告。
平均能量损失
\documentclass[hyperref=unicode]{beamer}
\usepackage[nil,bidi=basic-r]{babel}
\babelprovide[import=ar-DZ, main]{arabic}
\babelprovide[import, language=Default]{english}
\babelfont{rm}{Amiri}
\babelfont{sf}{Amiri}
\begin{document}
\begin{frame}{}
\today
\end{frame}
\begin{frame}{}
\selectlanguage{english}
\today
\end{frame}
\end{document}
答案2
您可以将语言设置为默认语言:
\documentclass[hyperref=unicode]{beamer}
\usepackage[english,nil,bidi=basic-r]{babel}
\babelprovide[import=ar-DZ, main]{arabic}
\babelfont{rm}[Language=Default]{Amiri}
\babelfont{sf}[Language=Default]{Amiri}
\begin{document}
\begin{frame}{}
\today
\end{frame}
\begin{frame}{}
\selectlanguage{english}
\today
\end{frame}
\end{document}
答案3
首先,您可以忽略此警告。它是无害的。(但是,我同意抑制无意义的警告是一种很好的做法,这样您就不会错过有意义的警告。)
David Purton 的回答非常优雅,但有一种情况可能需要更复杂的东西:如果您要为同一种语言加载不同的字体,则需要不同的选项。例如, a\babelfont[chinese-traditional]{rm}
可能支持Language=Chinese Traditional
,而 a\babelfont[chinese-traditional]{sf}
可能支持CJKShape = Traditional
。更直接的是,一些阿拉伯字体(包括 Noto Sans Arabic)不支持Language=Arabic
。
在这种情况下,您需要fontspec
向命令传递不同的选项\babelfont
:
\babelfont{rm}[Scale=1.0]{Amiri}
\babelfont[english]{rm}[Language=Default]{Amiri}
然而,Khaled Hosny 的 Amiri 的一个很棒的多语言配套字体是他的另一个字体系列 Libertinus。他基于 Linux Libertine 设计了 Libertinus Serif,基于 Linux Biolinum 设计了 Libertinus Sans。我会让他谈谈 Amiri 中拉丁字母的灵感来源,但它们非常接近。您还可以使用 选择数学字体unicode-math
。
如果您想启用这些字体的所有字体功能,您可以尝试以下操作:
\documentclass[hyperref=unicode]{beamer}
\usepackage[nil,bidi=basic-r]{babel}
\babelprovide[import=ar-DZ, main]{arabic}
\babelprovide[import=en, language=Default]{english}
\babelfont{rm}[Scale=1.0,
Ligatures={Common, TeX},
UprightFeatures={Ligatures=Discretionary},
Numbers={OldStyle,Proportional}
]{Libertinus Serif}
\babelfont{sf}[Scale=MatchLowercase,
Ligatures=TeX,
UprightFeatures={Ligatures={Common, Discretionary}},
BoldFeatures={Ligatures=Common}
]{Libertinus Sans}
\babelfont[arabic]{rm}[Scale=MatchLowercase,
Ligatures={Common, TeX},
Contextuals={WordInitial,WordFinal,Inner}
]{Amiri}
您可以将上标 OpenType 功能与该realscripts
包一起使用。
请注意,由于一个错误,Babel 3.27 及以下版本会忽略\defaultfontfeatures
。\babelfont
我已经在这里解决了这个错误,但修复正在进入发布树。
此时,由于beamer
默认使用无衬线字体,因此您需要定义\babelfont[arabic]{sf}
。您可以复制行babelfont[arabic]{rm}
或加载无衬线阿拉伯字体,例如:
\babelfont[arabic]{sf}[Scale=MatchLowercase,
Ligatures=Discretionary,
Language=Default
]{Noto Sans Arabic}
答案4
恰恰相反,这没什么不对。这些警告由 显示fontspec
,而不是 由 显示babel
。它们可能与英语无关,但与许多其他语言(包括阿拉伯语)无关。要将它们全部删除(它们仅在设置文档格式时才真正有用),您可以将选项传递silent
给fontspec
:
\usepackage[english,nil,bidi=basic-r]{babel}
\babelprovide[import=ar-DZ, main]{arabic}
\PassOptionsToPackage{silent}{fontspec}
\babelfont{rm}{Amiri}
\babelfont{sf}{Amiri}
或者:
\usepackage[english,nil,bidi=basic-r]{babel}
\babelprovide[import=ar-DZ, main]{arabic}
\usepackage[silent]{fontspec}
\babelfont{rm}{Amiri}
\babelfont{sf}{Amiri}
编辑。silent
第三个选项是作为类选项传递。