我的问题是关于希腊文字的,但我想它也可以是任何其他文字。
如果我设置的字体\setmainfont{#latinfont}
不包含希腊字形,因此设置了另一种字体\newfontfamily\greekfont[script=Greek]{#greekfont}
,则我的 PDF 中不会出现 xelatex 的希腊语输出。为了获得希腊语脚本,我必须将相应的文本括在内\textgreek{#text}
。
我的 MWE 如下
\documentclass{article}
\usepackage{polyglossia}
\setmainfont{Cantarell}
\setsansfont{Cantarell}
\newfontfamily\greekfont[Script=Greek]{Liberation Serif}
\newfontfamily\greekfontsf[Script=Greek]{Liberation Serif}
\setdefaultlanguage{english}
\setotherlanguage{greek}
\begin{document}
\tableofcontents{}
\section{Αυτό είναι ελληνικά.}
Welcome to Greek ``serif'': Αυτό είναι ελληνικά
Welcome to Greek ``sans'': \textsf{Αυτό είναι ελληνικά}
Another try to get Greek: \textgreek{Αυτό είναι ελληνικά}
\end{document}
编译后为
不幸的是,总是使用\textgreek
不仅麻烦,而且在某些情况下也不可能。例如在参考书目中,我在 zotero 中组织我的图书馆,并从那里以 UTF-8 编码导出到 biblatex。因此,例如文章标题中的希腊文包含在参考书目中,通常只有一个字符(例如 γ-羟基丁酸)。
因此我的问题是:是否可以让 xelatex/xetex/polyglossia/fontspec 根据源文件中存在的脚本选择正确的字体?如果可以,我该如何实现?如果没有,是否有其他选择或解决方法?
答案1
您可以使用ucharclasses
,但适当的标记更好。
\documentclass{article}
\usepackage{polyglossia}
\usepackage{ucharclasses}
\setmainfont{XCharter} % no Cantarell on my machine
\setsansfont{Futura} % a different one
\newfontfamily{\greekfont}{Liberation Serif}[
Script=Greek,
NFSSFamily=liberationserif,
]
\newfontfamily{\greekfontsf}{Liberation Sans}[
Script=Greek,
NFSSFamily=liberationsans,
]
\setdefaultlanguage{english}
\setotherlanguage{greek}
\makeatletter
\newcommand{\switchtogreek}{%
\ifnum\strcmp{\f@family}{\sfdefault}=\z@
\usefont{\encodingdefault}{liberationsans}{\f@series}{\f@shape}
\else
\usefont{\encodingdefault}{liberationserif}{\f@series}{\f@shape}
\fi
}
\makeatother
\setTransitionsForGreek{\begingroup\switchtogreek}{\endgroup}
\begin{document}
\tableofcontents
\section{Αυτό είναι ελληνικά.}
Welcome to Greek ``serif'': Αυτό είναι ελληνικά
\textsf{Welcome to Greek ``sans'': Αυτό είναι ελληνικά}
Another try to get Greek: \textgreek{Αυτό είναι ελληνικά}
\end{document}