为了回应已删除的帖子,我尝试提出一个问题来回答:
在 Ubuntu 系统上,XeLaTeX 在哪里寻找字体中的小型大写字母形状?
答案1
支持小型大写字母的正确 OpenType 字体会将它们作为未编码的字形保存在同一字体文件中,可通过激活smcp
和/或c2sc
功能进行访问。某些字体可能会选择在私有使用区域中对它们进行编码,同时仍可通过功能进行访问,但这是一种过时的做法,Adobe 曾鼓励过这种做法,但不再推荐,无论哪种情况,都强烈建议不要直接在文档中使用私有使用区域中的代码。
一些较旧的字体在单独的文件中有小型大写字母,在这种情况下,您必须fontspec
使用键告诉小型大写字母字体的名称SmallCapsFont
,否则它将找不到它,例如 Latin Modern 有一个单独的小型大写字母字体:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[SmallCapsFont={Latin Modern Roman Caps}]{Latin Modern Roman}
\begin{document}
Text \textsc{Text}
\end{document}
答案2
(这曾经是回答帖在将 \scshape 或 \textsc 与 fontspec/xelatex 结合使用 - TeX - LaTeX)
好吧,我有点被这些小型大写字母的事情困扰了,所以我将把它作为一个单独的帖子放在这里...本质上,困扰我的是 - 小型大写字母的字形是从哪里取来的?
如果我在我的系统上搜索 Junicode,我会得到:
$ find / -xdev -iname '*junicode*' 2>/dev/null | grep '\.ttf'
/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType/Junicode-BoldItalic.ttf
/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType/Junicode-Regular.ttf
/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType/Junicode-Italic.ttf
/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType/Junicode-Bold.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-BoldItalicCondensed.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-BoldItalic.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-BoldCondensed.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-Regular.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-Italic.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-Bold.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-RegularCondensed.ttf
/usr/share/fonts/truetype/ttf-junicode/Junicode-ItalicCondensed.ttf
我真的不能确切地说出到底使用了哪一个xelatex
- 但那里肯定没有特殊的“小型大写” .ttf 字体。
好的,然后fontspec
将其发送到日志:
.................................................
. fontspec info: "defining-font"
.
. Font family 'Junicode(0)' created for font 'Junicode' with options
. [Ligatures=TeX,].
.
. This font family consists of the following shapes:
.
. * 'normal' with NFSS spec.:
. <->"Junicode/ICU:script=latn;language=DFLT;mapping=tex-text;"
.
. * 'small caps' with NFSS spec.:
. <->"Junicode/ICU:script=latn;language=DFLT;mapping=tex-text;+smcp;"
.
. * 'bold' with NFSS spec.:
. <->"Junicode/B/ICU:script=latn;language=DFLT;mapping=tex-text;"
.
. * 'italic' with NFSS spec.:
. <->"Junicode/I/ICU:script=latn;language=DFLT;mapping=tex-text;"
.
. * 'bold italic' with NFSS spec.:
. <->"Junicode/BI/ICU:script=latn;language=DFLT;mapping=tex-text;"
手册中有一些关于 OpenType 选项的内容字体规格.pdf;其中之一是“ smcp
”,它应该指定小写字母。那么,这是什么意思呢?
然后,我偶然将 PDF 中的小型大写字母文本复制粘贴到文本编辑器中scite
- 我看到的是:小型大写字母:“A”(这也显示在我的 Firefox 中)!那么,在这种情况下,小型大写字母是字体内 Unicode 映射的一部分?!因此,我选择小写字母“”,在 中查找gnome-character-map
,结果如下:
另外,在 中gnome-specimen
,小型大写 Unicode 字符可以呈现为粗体:
请注意,在 中gnome-character-map
,我只有“Junicode”的条目,并且可以为其选择“粗体”和“斜体”。小写字母“A”是“”,代码点为 U+F761,来自所谓的“私人使用区”。因此,这显然不是标准,但如果我在 Junicodegnome-character-map
和 Firefox 中都看到它,并且字体不相关,那么 U+F761 可能被视为小写字母 A 的标准编码?还发现 U+F761 在Adobe 字形列表.txt(通过Glyph | Adobe 开发人员连接; 通过Adobe 论坛:OpenType 小型大写字母差异)。
但我仍然很困惑 - 为什么gnome-character-map
在普通和粗体的“Junicode”字体中都显示小写字母 A;而且还会xelatex
抱怨?
无论如何,在浏览 fontspec.pdf 手册后,发现了另一个有用的选项,FakeBold
...并想出了一个例子,最终向我证明'JunicodeBold'中没有 U+F761:
...,但为什么会gnome-character-map
显示它呢?(也许它也使用了“FakeBold”:)
)确实,font-forge
最终证实了这一点:
至少,现在我知道每个字体变体(bold.ttf、italic.ttf)都应该有小写字符字形,如果fontspec
应该将它们用作相应的小写字符......
现在,我只希望我可以轻松地说fontspec
:“当您遇到 Junicode-Bold 中的 U+F761 请求时 - 请参考 Junicode-Regular 中的 U+F761,并将该字形与 FakeBold=2.0 一起使用”:)
无论如何,这里是代码:
\documentclass[letterpaper,12pt]{article}
% \typeout{ == \the\paperwidth / \the\paperheight ==}
% \typeout{ == \the\pdfpagewidth / \the\pdfpageheight ==}
\pdfpagewidth=\paperwidth \pdfpageheight=\paperheight
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Junicode}
% https://tex.stackexchange.com/a/14382/2595
\makeatletter
\newcommand{\showfont}{encoding: \f@encoding{},
family: \f@family{},
series: \f@series{},
shape: \f@shape{},
size: \f@size{}
}
\makeatother
\begin{document}
{\scshape \showfont Aa}
{\fontspec[Letters=SmallCaps]{Junicode} \showfont Aa}
{\bfseries\scshape \showfont Aa}
{\fontspec[Letters=SmallCaps,FakeBold=2.5]{Junicode} \showfont Aa}
%kpathsea: Invalid fontname `Junicode Bold', contains ' '
{\fontspec[Letters=SmallCaps]{JunicodeBold} \showfont Aa}
{\fontspec{JunicodeBold} \showfont A J}
{\fontspec{Junicode} \bfseries\showfont A J}
{\fontspec{Junicode} \showfont A J}
\end{document}
干杯!