在文本模式下使用不同的数字字体

在文本模式下使用不同的数字字体

我正在写一个文档,我想使用一个主字体,我们把它称为我的字体,我有几个 .otf 文件。为此,我使用 XeTeX 以及包fontspecsetmainfont命令:

\usepackage{fontspec}
\setmainfont[Mapping=tex-text,
  BoldFont={myfont-bold.otf}, 
  ItalicFont={myfont-italic.otf},
  BoldItalicFont={myfont-bolditalic.otf}
]{myfont.otf}

我遇到的问题是我的字体是因为我不喜欢数字。因此,我想使用另一种字体,但只用于数字。如果命令setmainfont有一个numbers选项,这可能是可行的,但它没有。我还想明确指出,该字体不支持带线的数字,并且只带有旧样式。

在我看来,有两种方法可以实现这一点:

1/ 使所有数字使用数学字体

如果我可以让每个数字都调用数学字体,那就没有问题了,因为数学字体数字看起来不错。主要问题是我不知道是否可以做到这一点以及如何做到这一点。

2/ 手动替换字符

这是我发现的两个资源所建议的: 这里这里- 后者引用前者。他们的解决方案是使用fontspec包并使用以下方法手动交换字符:

\usepackage{fontspec}
\XeTeXinterchartokenstate=1
\chardef\CharNormal=0
\makeatletter
% Test for old and new versions of the latex kernel
\ifx\e@alloc@intercharclass@top\@undefined
    \chardef\CharBound=255
\else
    \chardef\CharBound=\e@alloc@intercharclass@top
\fi
\makeatother
\newXeTeXintercharclass\CharNumbers
\XeTeXcharclass`0=\CharNumbers
\XeTeXcharclass`1=\CharNumbers
\XeTeXcharclass`2=\CharNumbers
\XeTeXcharclass`3=\CharNumbers
\XeTeXcharclass`4=\CharNumbers
\XeTeXcharclass`5=\CharNumbers
\XeTeXcharclass`6=\CharNumbers
\XeTeXcharclass`7=\CharNumbers
\XeTeXcharclass`8=\CharNumbers
\XeTeXcharclass`9=\CharNumbers
\newtoks\TokSetfont
\TokSetfont={\begingroup\fontspec{Latin Modern Mono}}
\XeTeXinterchartoks\CharNormal\CharNumbers=\TokSetfont
\XeTeXinterchartoks\CharBound\CharNumbers=\TokSetfont
\XeTeXinterchartoks\CharNumbers\CharNormal={\endgroup}
\XeTeXinterchartoks\CharNumbers\CharBound={\endgroup}

这个解决方案的问题在于它似乎不起作用;它使 XeLaTeX 编译非常慢,返回内存错误,最终数字保持不变。原始解决方案是在这个答案,并且正如评论所暗示的,似乎正在运行一个无限循环。

由于这些帖子已经很旧了,而且解决方案似乎不再有效,我想我会再次询问是否有人知道如何更改数字的主字体。我完全知道这是一件极其不重要的事情,但仍然:有什么想法吗?

[编辑]为了方便起见,使用免费字体的最小工作示例:

% !TeX program = xelatex
\documentclass{article}

\usepackage{fontspec}
\setmainfont[
    BoldFont={Georgia Bold}, 
    ItalicFont={Georgia Italic},
    BoldItalicFont={Georgia Bold Italic},
    SmallCapsFont={Latin Modern Roman Caps}
    ]{Linux Libertine O}

\begin{document}

Everything \textbf{just} \textsc{Works}, \\
but I don't like this ``1''

\end{document}

答案1

瓶颈在于使用\fontspec。最好声明一个新的字体系列,这样在每次开始一连串数字时就不会重新进行字体分配。

\documentclass{article}
\usepackage{fontspec}

\setmainfont{TeX Gyre Termes}
\newfontfamily{\digits}{TeX Gyre Heros}

\XeTeXinterchartokenstate=1
\chardef\CharNormal=0
\makeatletter
% Test for old and new versions of the latex kernel
\ifx\e@alloc@intercharclass@top\@undefined
    \chardef\CharBound=255
\else
    \chardef\CharBound=\e@alloc@intercharclass@top
\fi
\makeatother
\newXeTeXintercharclass\CharNumbers
\XeTeXcharclass`0=\CharNumbers
\XeTeXcharclass`1=\CharNumbers
\XeTeXcharclass`2=\CharNumbers
\XeTeXcharclass`3=\CharNumbers
\XeTeXcharclass`4=\CharNumbers
\XeTeXcharclass`5=\CharNumbers
\XeTeXcharclass`6=\CharNumbers
\XeTeXcharclass`7=\CharNumbers
\XeTeXcharclass`8=\CharNumbers
\XeTeXcharclass`9=\CharNumbers

\XeTeXinterchartoks\CharNormal\CharNumbers={\begingroup\digits}
\XeTeXinterchartoks\CharBound\CharNumbers={\begingroup\digits}
\XeTeXinterchartoks\CharNumbers\CharNormal={\endgroup}
\XeTeXinterchartoks\CharNumbers\CharBound={\endgroup}

\begin{document}

\count255=0

\loop\ifnum\count255<1000
\advance\count255 1
Text 123 text1text\endgraf
123\endgraf
\repeat

\end{document}

我尝试了带有和不带有 interchar 标记的这 2000 个段落,编译时间是相当的。

在此处输入图片描述

相关内容