XeLaTeX:如何为非拉丁文本中的拉丁文本指定不同的字体系列?

XeLaTeX:如何为非拉丁文本中的拉丁文本指定不同的字体系列?

在主要语言为非拉丁语(即使用非拉丁字母)的 XeLaTeX 文档中,我希望使用与正文不同的字体系列来排版拉丁文本。如何以自动、全文档的方式执行此操作?

例如,假设主要语言为泰语,XeLaTeX 源码如下:

\documentclass{article}

\usepackage{polyglossia}
\usepackage{fontspec}
\setdefaultlanguage{thai}
\newfontfamily\thaifont{Thonburi}

\begin{document}
ดาวพุธมีหลุมอุกกาบาตจำนวนมากจนดูคล้ายดวงจันทร์ ภูมิลักษณ์ที่เด่นที่สุดบนดาวพุธ คือ แอ่งแคลอริส (Caloris Basin)
\end{document}

我希望短语“Caloris Basin”的排版字体为 Cambria,而不是 Thonburi。到目前为止,反复试验并未让我得到想要的结果。

答案1

只需像设置主要语言一样设置其他语言的字体,然后将其用于\text<otherlang>{...}该语言的一小部分或\begin{<otherlang>} ... \end{<otherlang>}大部分:

% !TEX TS-program = XeLaTeX

\documentclass{article}

\usepackage{polyglossia}
\usepackage{fontspec}
\setdefaultlanguage{thai}
\setotherlanguage{english}
\newfontfamily\englishfont{Cambria}
\newfontfamily\thaifont{Thonburi}

\begin{document}
ดาวพุธมีหลุมอุกกาบาตจำนวนมากจนดูคล้ายดวงจันทร์ ภูมิลักษณ์ที่เด่นที่สุดบนดาวพุธ คือ 
แอ่งแคลอริส \textenglish{(Caloris Basin)}
\end{document}

代码输出

评论

如果你的问题是问是否有可能从源头自动检测语言,答案是可能的(参见其他答案),尽管这些方法增加了一些复杂性。最安全的方法是使用一些标记来区分不同的语言。

答案2

该包ucharclasses可以做到这一点。对于其他字母表中的短文本插入,连字符不应该是问题;对于较长的部分,polyglossia建议使用的各种功能。

\documentclass{article}

\usepackage{polyglossia}
\usepackage{fontspec}
\setmainlanguage{thai}

\newfontfamily\thaifont{Thonburi}
\newfontfamily\englishfont{TeX Gyre Bonum} % just to get a distinctive font

\usepackage[Latin,Thai]{ucharclasses}

\setTransitionsForLatin
  {\begingroup\englishfont}
  {\endgroup}

\begin{document}

ดาวพุธมีหลุมอุกกาบาตจำนวนมากจนดูคล้ายดวงจันทร์ ภูมิลักษณ์ที่เด่นที่สุดบนดาวพุธ คือ
แอ่งแคลอริส (Caloris Basin) ดาวพุธมีหลุมอุกกาบาตจำนวนมากจนดูคล้ายดวงจันทร์
ภูมิลักษณ์ที่เด่นที่สุดบนดาวพุธ คือ แอ่งแคลอริส

\end{document}

在此处输入图片描述

注意:由于单词太长,代码产生了一个溢出的框;由于我不懂泰语,所以我只是复制了相同的文本。

答案3

XeTeX 的 interchartoks 功能可以有限地用于此类事情。下面显示了一个示例。

利用此功能,每个字符都分配有一个“字符类”,如果源文件中一个字符的字符类切换(例如从泰语切换到拉丁语),则可以插入附加内容。在示例中,\thaifont当字符类从默认切换到泰语时以及\otherfont当字符类从泰语切换到默认时,都会插入。

有一些极端情况可能会使此功能变得棘手,但如果您只是对泰语文本中的小片段感兴趣,我相信此功能会非常方便。

\documentclass{article}

\usepackage{polyglossia}
\usepackage{fontspec}
\setdefaultlanguage{thai}
\newfontfamily\otherfont{Times}
\newfontfamily\thaifont{Thonburi}

\XeTeXinterchartokenstate = 1\relax
\newXeTeXintercharclass\thaiclass
\ExplSyntaxOn
\int_step_inline:nnnn {"0E00}{1}{"0E7F}
 { \XeTeXcharclass #1 = \thaiclass }
\clist_map_inline:nn {\(,\),\.,\,,\:,\;,\?,\!}
 { \XeTeXcharclass `#1 = \thaiclass\relax }
\ExplSyntaxOff
\XeTeXinterchartoks \thaiclass 0 = {\otherfont}
\XeTeXinterchartoks 0 \thaiclass = {\thaifont}

\begin{document}
ดาวพุธมีหลุมอุกกาบาตจำนวนมากจนดูคล้ายดวงจันทร์ ภูมิลักษณ์ที่เด่นที่สุดบนดาวพุธ คือ แอ่งแคลอริส (Caloris Basin)
\end{document}

更新:对所有标点符号也使用泰语字体非常重要,因为字符类特性在处理空格时似乎表现得有些异常。

相关内容