我在文档中设置旧式数字时遇到了一些问题。我加载了字体(在本例中是早期的 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}