目标

目标

摆弄之后egreg 的回答对于我之前的问题,我终于发现lualatex没有选择tnumOpenType 功能,也就是说它使用默认数字而不是等宽衬线,而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=nodemode=baseRenderer=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

XeTeX 结果

结果luatex如下

在此处输入图片描述

因此,当字体在数学模式下使用时,LuaTeX 似乎会忽略属性。我不知道错误出在哪里。


要获取字体名称,只需在示例末尾添加

\liningmain\fontname\font

并使用 XeLaTeX 和 LuaLaTeX 进行编译。我删除了该选项RawFeature=+tnum,只是+tnum再添加一次,没有任何区别。

相关内容