XeLaTeX 在哪里寻找字体中的小型大写字母形状?

XeLaTeX 在哪里寻找字体中的小型大写字母形状?

为了回应已删除的帖子,我尝试提出一个问题来回答:

在 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,结果如下:

charmap junicode - 正常与粗体

另外,在 中gnome-specimen,小型大写 Unicode 字符可以呈现为粗体:

侏儒标本

请注意,在 中gnome-character-map,我只有“Junicode”的条目,并且可以为其选择“粗体”和“斜体”。小写字母“A”是“”,代码点为 U+F761,来自所谓的“私人使用区”。因此,这显然不是标准,但如果我在 Junicodegnome-character-map和 Firefox 中都看到它,并且字体不相关,那么 U+F761 可能被视为小写字母 A 的标准编码?还发现 U+F761 在Adobe 字形列表.txt(通过Glyph | Adob​​e 开发人员连接; 通过Adobe 论坛:OpenType 小型大写字母差异)。

但我仍然很困惑 - 为什么gnome-character-map在普通和粗体的“Junicode”字体中都显示小写字母 A;而且还会xelatex抱怨?

无论如何,在浏览 fontspec.pdf 手册后,发现了另一个有用的选项,FakeBold...并想出了一个例子,最终向我证明'JunicodeBold'中没有 U+F761:

测试.png

...,但为什么会gnome-character-map显示它呢?(也许它也使用了“FakeBold”:))确实,font-forge最终证实了这一点:

fontforge-junicode.png

至少,现在我知道每个字体变体(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}

干杯!

相关内容