我正在尝试使用 XeLaTeX 用 Times 排版我的文档。由于 Times 不包含小型大写字母,因此我只想使用 TeX Gyre Termes 来排版小型大写字母。我试过此方法,但不起作用。发出警告,并且输出不是小写字母。
问题:
- 怎么了?
- 我怎样才能做到这一点?
以下是 MWE:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[
SmallCapsFont={TeX Gyre Termes},
SmallCapsFeatures={Letters=SmallCaps},
]{Times}
\begin{document}
Hello!
\textsc{Hello!}
\end{document}
并发出警告:
*************************************************
* fontspec warning: "aat-feature-not-exist-in-font"
*
* AAT feature 'Letters=SmallCaps' (3,3) not available in font 'TeX Gyre
* Termes'.
*************************************************
我尝试过的:
- 我尝试使用 LuaLaTeX 排版,结果很好,没有任何警告。
- 我替换
Times
了Times New Roman
,没有问题。 - 我添加了
Renderer=ICU
,警告改为icu-feature-not-exist-in-font
。看来 fontspec 可以.dfont
与 ICU 一起使用? - 我换了
Times
另一种.dfont
字体Helvetica Neue
,问题就消失了。因此不是所有.dfont
字体都会导致问题……
我在 OS X Mountain Lion 上使用 MacTeX 2013。
更新
根据@KhaledHosny的建议,我尝试\the\XeTeXfonttype\font
在 之前和之后添加\textsc{
,结果都返回了1
(AAT 字体)。Render=ICU
添加 后它们返回了2
(OpenType 字体),但没有得到小写字母。看来 XeTeX 可以将 Times 视为 OpenType,但即便如此也SmallCapsFeatures
不起作用。
答案1
我发现这可以通过 NFSS 实现。
首先,Times 和 TeX Gyre Termes 是分开加载的。然后 NFSS 中 Times 的小写字母定义被覆盖,从而重定向到 TeX Gyre Termes 的小写字母。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Times}
\newfontfamily\tgtermes{TeX Gyre Termes}
\makeatletter
\begingroup
\tgtermes
\DeclareFontShape{\f@encoding}{\rmdefault}{m}{sc}{%
<-> ssub * \f@family/m/sc}{}
\DeclareFontShape{\f@encoding}{\rmdefault}{bx}{sc}{%
<-> ssub * \f@family/bx/sc}{}
\endgroup
\makeatother
\begin{document}
Hello!
\textsc{Hello!}
\end{document}
答案2
也许最简单的方法如下:
在示例中,深红文字没有小型大写字母,但是赤红确实如此。(此处使用的比例仅与本例中更好看的输出有关。)
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Crimson Text}
\newfontinstance\scshape[Letters=SmallCaps,Scale=1.15]{Crimson}
\begin{document}
Text \textsc{Text}
\end{document}
更新如前所述这里,\newfontinstance
不再起作用,已替换为\newfontfamily
。