摆弄之后egreg 的回答对于我之前的问题,我终于发现lualatex
没有选择tnum
OpenType 功能,也就是说它使用默认数字而不是等宽衬线,而xelatex
选择了正确的数字。
目标
要使用 Calluna 字体,在正文中使用 OldStyle 图形,并在数学模式中使用 Lining 图形,使用最好可使用 编译的代码lualatex
。
问题
Calluna 默认具有 OldStyle 数字,因此命名字符one
返回 LowerCase 1。egreg 提供的代码应该one.tnum
在数学模式下选择字符(或者pnum
像他最初的答案中那样,但这只会影响水平间距)。他的代码使用 工作正常xelatex
,但lualatex
产生的是字符one
,对于大多数字体来说,这实际上是一个衬线、比例的数字,所以正是 egreg 所期望的,但对于 Calluna 来说,这是一个旧式的比例数字。由于 Calluna 不是免费提供的,我更改了代码以使用 EB Garamond,它产生了相同的结果。
编辑
问题实际上在于lualatex
和 egreg 代码的组合,因为\setmainfont
完全遵守了正常选项lualatex
,如果我将它们设置为 Lining,我会在正文中得到 Lining 图形,但在数学文本中仍然没有。参见我原来的问题以及使用此代码而不是mathspec
例如的原因。
在 GitHub上提交问题后luaotfload
,问题似乎是 fontspec默认使用Renderer=Full
/选项,而在数学模式下应该使用/ 。但是,现在字体功能的应用不一致,在编译之间随机变化。mode=node
mode=base
Renderer=Basic
问题
我怎样才能改变代码,这样lualatex
始终如一tnum
在数学模式下使用直线、等宽数字(OpenType 功能),而eulervm
在数学模式下使用所有其他字符?
代码
\documentclass[landscape]{scrartcl}
\usepackage{amsfonts}
\usepackage{eulervm}
\usepackage{siunitx}
\usepackage{ifluatex}
\usepackage[no-math]{fontspec}
\setmainfont[
Ligatures={Common,TeX},
Numbers={OldStyle,Proportional},
]{EBGaramond12-Regular.otf}
% ]{Calluna}
\setsansfont[
Ligatures={Common,TeX},
Numbers={Lining,Proportional},
]{TeX Gyre Heros}
\setmonofont[
Ligatures={NoRequired,NoCommon,NoContextual},
Numbers={Lining,Monospaced},
]{TeX Gyre Cursor}
% LuaTeX uses the full renderer by default, this does not work in math mode, so negate manually
\ifluatex
\newfontfamily{\liningmain}[
Ligatures={Common,TeX},
Numbers={Lining,Monospaced},
Renderer=Basic,
]{EBGaramond12-Regular.otf}
% ]{Calluna}
\else
\newfontfamily{\liningmain}[
Ligatures={Common,TeX},
Numbers={Lining,Monospaced},
]{EBGaramond12-Regular.otf}
% ]{Calluna}
\fi
% A trick for extracting the family information
% which works independently of the chosen font
\begingroup
\def\getfamily#1#2#3#4#5{#4}
\edef\x{\endgroup
\def\noexpand\liningdefault{\expandafter\expandafter\expandafter
\getfamily\csname liningmain \endcsname}}\x
\DeclareSymbolFont{liningmath}{\encodingdefault}{\liningdefault}{m}{n}
\DeclareSymbolFontAlphabet{\mathlining}{liningmath}
\Umathcode`0="7 \symliningmath `0
\Umathcode`1="7 \symliningmath `1
\Umathcode`2="7 \symliningmath `2
\Umathcode`3="7 \symliningmath `3
\Umathcode`4="7 \symliningmath `4
\Umathcode`5="7 \symliningmath `5
\Umathcode`6="7 \symliningmath `6
\Umathcode`7="7 \symliningmath `7
\Umathcode`8="7 \symliningmath `8
\Umathcode`9="7 \symliningmath `9
\sisetup{
math-rm = \mathlining,
}
\usepackage{polyglossia}
\setmainlanguage[variant=british]{english}
\usepackage{blindtext}
\begin{document}
\section{testing}
\begin{tabular}{p{.15\textwidth}p{.85\textwidth}}
\hline
Mode & Result\\
\hline
Normal font & \fontname\font\\
Lining font & {\liningmain\fontname\font}\\
Text mode & 1234567890\\
Math mode & \(1234567890\)\\
\verb|\SI| text mode & \SI{1042358769}{\metre}\\
\verb|\SI| math mode & \(\SI{1234567890}{\metre}\)\\
\verb|\num| text mode & \num{1234567890}\\
\verb|\num| math mode & \(\num{1234567890}\)\\
verbatim & \verb|1234567890|\\
\hline
\end{tabular}
\end{document}
答案1
问题出在luatex
(可能在);如果我从你的代码中luaotfload
询问对应的字体,我得到\liningmain
"[EBGaramond12-Regular.otf]/ICU:script=latn;language=DFLT;+liga;mapping=tex-text;+lnum;+tnum;"
使用 XeLaTeX 和
"[EBGaramond12-Regular.otf]:mode=node;script=latn;language=DFLT;+liga;+tlig;+trep;+lnum;+tnum;"
使用 LuaLaTeX。所以我准备了以下文件
\input ifxetex.sty
\ifxetex
\font\test="[EBGaramond12-Regular.otf]/ICU:script=latn;language=DFLT;+liga;mapping=tex-text;+lnum;+tnum;"
\else
\input luaotfload.sty
\font\test="[EBGaramond12-Regular.otf]:mode=node;script=latn;language=DFLT;+liga;+tlig;+trep;+lnum;+tnum;"
\fi
\test
1234567890
\textfont0=\test
$1234567890$
\bye
由于数学模式中的数字使用\textfont0
其默认定义,我应该得到两组衬线图。这是我得到的xetex
结果luatex
如下
因此,当字体在数学模式下使用时,LuaTeX 似乎会忽略属性。我不知道错误出在哪里。
要获取字体名称,只需在示例末尾添加
\liningmain\fontname\font
并使用 XeLaTeX 和 LuaLaTeX 进行编译。我删除了该选项RawFeature=+tnum
,只是+tnum
再添加一次,没有任何区别。