状态更新
在一封私人电子邮件中,Bogusław Jackowski(我向他表示衷心的感谢)承认这是 TeX Gyre 字体中的一个错误。由于 TeX Gyre 团队正在努力完成 TeX Gyre 项目的另一个部分,他无法承诺修复此问题的日期,但他估计最好的时间是明年某个时候。
土耳其语字符转为小写和土耳其语字符转为大写尝试解决我们这些需要处理全大写和小写点字母 i/İ 的人的烦恼。据我所知,所有答案都与引擎有关pdftex
。
下面是我的 MWE,用来说明我的烦恼:
\documentclass[a4paper,12pt]{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Adventor}
\begin{document}
\noindent
{\Huge
\textsc{Eb\.ı} \.Incelemesi\\[6pt]
\textsc{Eb\.{}\kern -0.215em ı} \.Incelemesi
}
\end{document}
输出如下:
现在,有人可以向我解释一下吗:
- (好奇)为什么 B 上的点重音符号如此不协调?
- (真正的问题)鉴于(a)我的字体似乎都没有 TRK 功能;(b)尽管它们都有带点的小写字母 İ,但字形表中的位置会有所不同,而且 Unicode 代码点当然位于私有区域中的某个随机位置;(c)如果我更改字体,我手动调整“-0.215em”所花费的时间几乎肯定需要再次花费;那么有什么更好、更强大的方法来生成第二行?
针对 EGreg 的有趣评论,我“编造”了一个新的 MWE,并添加了一个 ı 来强调问题:
\documentclass[a4paper,12pt]{article}
\usepackage{fontspec}
\setmainfont[%
Script=Latin,
Language=Turkish,
]{TeX Gyre Adventor}
\begin{document}
\noindent
{\Huge
\textsc{Ebiı} İncelemesi\\[6pt]
}
\end{document}
这是输出;点仍然缺失:
所以现在我对自己很生气,我又添加了另一个选择:
\setmainfont[%
Script=Latin,
Language=Turkish,
Letters=UppercaseSmallCaps,
]{TeX Gyre Adventor}
其结果相同。
然后我切换到 Brill,使用相同的选项,得到了以下结果:
这当然不是我想要的,因为 EBİ 现在全部大写,而不是 SC。
到那时我就要睡觉了。 的正确行为是什么Letters=UppercaseSmallCaps
?
答案1
这似乎是 TeX Gyre 字体中 TRK 功能实现的一个错误。以下是示例:
\documentclass[a4paper,12pt]{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainfont{Brill}
\setmainlanguage{turkish}
\newfontfamily{\termes}[Language=Turkish]{TeX Gyre Termes}
\begin{document}
\textsc{Ebi} İncemelesi \textsc{ıIiİ}
\termes
\textsc{Ebi} İncemelesi \textsc{ıIiİ}
\end{document}
结果如下
日志文件清楚地表明两种字体都选择了 TRK 功能:
.................................................
. fontspec info: "defining-font"
.
. Font family 'TeXGyreTermes(0)' created for font 'TeX Gyre Termes' with
. options [Language=Turkish].
.
. This font family consists of the following shapes:
.
. * 'normal' with NFSS spec.:
. <->"TeX Gyre Termes/ICU:script=latn;language=TRK;"
.
. * 'small caps' with NFSS spec.:
. <->"TeX Gyre Termes/ICU:script=latn;language=TRK;+smcp;"
[...]
. fontspec info: "defining-font"
.
. Font family 'Brill(1)' created for font 'Brill' with options
. [,Language=Turkish].
.
. This font family consists of the following shapes:
.
. * 'normal' with NFSS spec.:
. <->"Brill/ICU:script=latn;language=TRK;"
.
. * 'small caps' with NFSS spec.:
. <->"Brill/ICU:script=latn;language=TRK;+smcp;"
[...]
polyglossia
以下是和之间交互的相关部分fontspec
(行号来自polyglossia.sty
):
253 \def\xpg@addfontfeature@lang#1#2{% #1 is langtag, #2 is langname
254 % Turkish is a special case: tag can be TRK or TUR
255 \edef\tmp@Turkish{Turkish}%
256 \edef\tmp@@langname{#2}%
257 % \ifstrequal{#2}{Turkish}%
258 \ifx\tmp@@langname\tmp@Turkish
259 \fontspec_if_language:nTF {TRK}%
260 {\addfontfeature{Language=Turkish}}%
261 {\fontspec_if_language:nTF {TUR}%
262 {\addfontfeature{Language=Turkish}}%
263 {}}%
264 % else not Turkish
265 \else
266 \edef\tmp@@langparam{Language=#2}%
267 \expandafter\expandafter\expandafter\fontspec_if_language:nTF \expandafter{#1}%
268 {\expandafter\expandafter\expandafter\addfontfeature\expandafter{\tmp@@langparam}}%
269 {}%
270 \fi
271 }
本质上,该Language=...
选项被传递给已定义的字体系列(并fontspec
创建一个新的字体系列,如上面报告的日志文件的结果)。土耳其语以特殊方式处理这一事实是一个令人高兴的巧合。
如果您不使用polyglossia
,那么无论如何您都应该为土耳其语定义一个字体系列,否则\textsc
当涉及非土耳其语时不会在“i”上给出预期的结果。
答案2
我觉得重音代码fontspec
看起来有点可疑。
如果您返回经典的 TeX 重音命令,但使用 Unicode 位置的点重音,情况会好一些。对于全尺寸 I,对齐似乎仍然略有偏差。
\documentclass[a4paper,12pt]{article}
\def\dotabove#1{{\accent729 #1}}
\usepackage{fontspec}
\setmainfont{TeX Gyre Adventor}
\begin{document}
\Huge
\textsc{Eb\.ı} \.Incelemesi
\textsc{Eb\.{}\kern -0.215em ı} \.Incelemesi
\textsc{Eb\dotabove ı} \dotabove Incelemesi
\end{document}