使用 fontspec 指定旧式数字字体

使用 fontspec 指定旧式数字字体

我在文档中设置旧式数字时遇到了一些问题。我加载了字体(在本例中是早期的 palatino)并通过 fontspec 定义了 smallcaps 字体。但旧式数字位于此字体的 smallcaps 变体中,不会显示在正文中。

\setmainfont[ Numbers={Proportional, OldStyle}, SmallCapsFont={PalmerCapsOld} ]{Palmer}

答案1

什么fontspec提供了启用 OpenType 功能的语法。您需要的是每次显示数字时切换字体的能力。

XeTeX 具有XeTeXinterchartoks实现此功能的功能;LuaTeX 则没有(至少不是直接实现;见下文)。

例如,尝试以下代码:

% !TeX program = xelatex
\documentclass{article}
\XeTeXinterchartokenstate = 1
\newXeTeXintercharclass \numeralsclass
\newXeTeXintercharclass \numeralsclass
\count255=`\0
\loop\ifnum\count255<`\9
    \XeTeXcharclass \count255 \numeralsclass
    \advance\count255 by 1
\repeat

\XeTeXinterchartoks 0 \numeralsclass = {\bgroup\itshape}
\XeTeXinterchartoks 255 \numeralsclass = {\bgroup\itshape}
\XeTeXinterchartoks \numeralsclass 0 = {\egroup}
\XeTeXinterchartoks \numeralsclass 255 = {\egroup}

\begin{document}
abc 123 def456jkl789

32

`33'--44
\end{document}

此代码为数字分配一个字符类,然后将其分配给 0–9。

字符类别 0(字母)或 255(非字符:glue、kern、math、box、ETC。) 和新定义的数字字符类,我们插入字体更改(\itshape为了可见性);在数字和类 0/255 之间我们插入\egroup以撤消该字体更改。

您应该能够将其应用到您的案例中,如下所示:

\setmainfont[ Numbers={Proportional}, SmallCapsFont={PalmerCapsOld} ]{Palmer}
\XeTeXinterchartoks 0 \numeralsclass = {\bgroup\scshape}
\XeTeXinterchartoks \numeralsclass 0 = {\egroup}
\XeTeXinterchartoks 255 \numeralsclass = {\bgroup\scshape}
\XeTeXinterchartoks \numeralsclass 255 = {\egroup}

但是...您想要一个 LuaLaTeX 解决方案。

在 LuaTex 中,是否可以根据所使用的脚本/字形更改字体/语言?对于模仿的 LuaTeX 代码XeTeXinterchartoks。问题在于代码执行时间的差异;如果我正确理解了 Manuel Pégourié-Gonnard 的评论,即使像这样的代码也\count255可能会中断。

您最好在文档上运行正则表达式搜索,将每一行数字用\textsc{•括起来}

答案2

引用 Khaled Hosny 的话回答字体规格:Palatino 字体,带小写字母和旧式数字,这是另一个解决方案:

您需要一个具有适当 OpenType 支持的 Palatino,或者您可以使用包含在 TeXlive 中的 TeX Gyre Pagella(这是 Zapf 的真正的 Palatino,并由 GUST 进一步开放类型化)。

\documentclass{article}
\usepackage{fontspec}

\setmainfont[Numbers=OldStyle]{TeX Gyre Pagella}

\begin{document}
Text 12345.
\end{document}

相关内容