我正在写一个文档,我想使用一个主字体,我们把它称为我的字体,我有几个 .otf 文件。为此,我使用 XeTeX 以及包fontspec
和setmainfont
命令:
\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 个段落,编译时间是相当的。