在 LuaLaTeX 中使用两种不同的数学字体

在 LuaLaTeX 中使用两种不同的数学字体

在一个文档中我需要同时使用 TrueType 和一些 Type1,所以我切换到了 LuaLatex。但是在设置数学字体时我发现了一个问题。这是我需要的:

  • 该文档使用 TrueType 衬线字体 (Crimson) 作为其主要字体,但显然唯一适合数学的是 Type1 字体 Cochineal,可通过 newtxmath 获得

  • 在文档的某些部分,我需要尽快切换到 sans 字体,并且有一些数学公式,我希望用相同的字体打印。我依靠这个包来sansmath实现这一点。

问题在于,该no-math选项fontspec似乎是一个全有或全无的选择。

这是我的设置(我使用特定的字体,但我想它与任何其他类似的字体设置相同)

\documentclass{article}
\usepackage[cochineal]{newtxmath}
\usepackage{sansmath}
\usepackage[no-math]{fontspec} % luatex
\setmainfont{Crimson-Roman}[Ligatures=TeX,
           ItalicFont = {Crimson-Italic},
           BoldFont = {Crimson-Semibold},
           BoldItalicFont = {Crimson-SemiboldItalic}]
\setsansfont{Asap-Regular}[
           ItalicFont ={Asap-Italic},
           BoldFont = {Asap-SemiBold},
           BoldItalicFont = {Asap-SemiboldItalic}]
\DeclareSymbolFont{operators}{\encodingdefault}{\familydefault}{m}{n}

\begin{document}

This is a text with the main font, and some math: $\sum_ix_i^2$

\sffamily\sansmath and here is some other text in sans, with some math too $\sum_ix_i^2/2$.

\end{document}

newtxmath但是,因为我用(和no-math中的选项)设置了数学字体,fontspec所以当公式为 sans 时,并非所有符号都能正确打印(即“/”符号从公式中消失)。

另一方面,如果我不设置newtxmath(或者,等效地,如果我不设置选项no-math),那么使用 sans 字体进行数学运算一切正常,但主要数学公式(使用 serif 字体)会以 ComputerModern 而不是 Crimson 字体打印。

似乎没有办法告诉 LuaTex 选择性地依赖 Type1 字体仅用于一种数学字体(与主/衬线字体匹配的字体),而不依赖另一种(与 sans 字体一起使用的字体)。

或者也许我的设置有问题。

还有一个问题\DeclareSymbolFont{operators}...:这个命令似乎是必要的,否则数字不能用(胭脂红)数学字体正确打印;然而,该命令影响全部数学字体。

答案1

虽然有点晚了,但这是个好问题。

要将 Type1 数学字体与 OpenType 文本字体一起使用,您可以\usepackage{mathspec}在 之后\newtxmath,并\setmathsfont在数学模式下使用文本字体。只要文本字体与数学符号匹配,就没问题了。

另一种方法是mathastext,现在支持fontspec

最后,在 中unicode-math,使用\defaultfontfeatures{Scale=MatchLowercase}并考虑是否有可用的 OpenType 数学字体如果你在其后加载\setmathfont[range=it]{Crimson Roman Italic}、等, 则会匹配良好。\setmathfont[range=up]{Crimson Roman}

答案2

我找到了一个解决方法。我不再使用 Type1 字体来处理数学问题;相反unicode-math,我使用 创建基于 Latin Modern 和 Crimson 的自定义数学字体(不如 newtx 好,但还可以)。对于 sans 中的数学,我创建了一个新命令,\mathsans允许我在每次需要时选择 sans 数学字体。可能还有其他更好的方法,但它确实有效。

\documentclass{article}
\usepackage{fontspec,unicode-math}
\setmainfont{Crimson-Roman}[Ligatures=TeX,
           ItalicFont = {Crimson-Italic},
           BoldFont = {Crimson-Semibold},
           BoldItalicFont = {Crimson-SemiboldItalic}]
\setsansfont{Arial}
\setmathfont{Latin Modern Math}
\setmathfont[range=\mathup/{num}]{Crimson-Roman}  % for numbers
\setmathfont[range=\mathit/{latin}]{Crimson-Italic}

\newcommand{\mathsans}{\setmathfont{Arial}
    \setmathfont[range=\mathit]{Arial-Italic}}

\begin{document}

Here the main font, with some math: $\sum_ix_i^2$

\sffamily\mathsans and here is some other text in sans, with some math too $\sum_ix_i^2/2$.

\end{document}

编辑:虽然此解决方案在最小示例中有效,但它会为较长的文件提供错误消息。具体来说,它似乎不允许多次切换到/从 sans 字体。错误是:

! LaTeX Error: Symbol font `__um_fam3' not defined.

现将相关情况报告如下:使用 unicode-math 切换数学字体

答案3

加载newtxmath sansmath,以恢复/

\documentclass{article}
\usepackage[no-math]{fontspec} % luatex
\usepackage{sansmath}
\usepackage[cochineal]{newtxmath}
\setmainfont{Crimson-Roman}[Ligatures=TeX,
           ItalicFont = {Crimson-Italic},
           BoldFont = {Crimson-Semibold},
           BoldItalicFont = {Crimson-SemiboldItalic}]
\setsansfont{Arial}
\DeclareSymbolFont{operators}{\encodingdefault}{\familydefault}{m}{n}

\begin{document}

This is a text with the main font, and some math: $\sum_ix_i^2$

\sffamily\sansmath and here is some other text in sans, with some math too $\sum_ix_i^2/2$.

\end{document}

enter image description here

答案4

正如@Davislor所建议的,这里有一个解决方案,使用mathastext代替sansmath。它也可以与 一起使用,pdflatex并且可以切换到tt字体。效果比我想象的要好。我使用cochineal代替 ,crimson因为后者没有希腊字体可供使用mathastext,所以它使用自己的字体。

\documentclass{article}

%%% lualatex
% \usepackage[no-math]{fontspec}
% % Crimson doesn't have greek letters
% \setmainfont{cochineal}
% \setsansfont{cabin}[Scale=MatchLowercase]
% \setmonofont{Inconsolatazi4}[
% StylisticSet={1,2,3},Scale=MatchLowercase]
%%% end lualatex

%%% pdflatex
% Crimson doesn't have greek letters
\usepackage{cochineal}
\usepackage[scale=0.88]{cabin}
\usepackage[varqu,varl,var0,scale=0.93]{inconsolata}
%%% end pdflatex

\usepackage[cochineal,vvarbb,smallerops]{newtxmath}


\usepackage[italic,defaultmathsizes,LGRgreek]{mathastext}

% for the sans switch command \MTversion{cabin}
\MTfamily{\sfdefault}
\MTupgreek % upright greek looks better in sans
\Mathastext[cabin]
\newenvironment{sfswitch}{\MTversion{cabin}}{}

% for the tt switch command \MTversion{inconsolata}
\MTfamily{\ttdefault}
\MTupgreek % upright greek looks better in sans
\Mathastext[inconsolata]

\begin{document}
\noindent
\emph{Serif} mode: $\mathbb{R,1}$ $\alpha\beta\gamma\delta, \Re z$ and
$\ln [\sin^{2} (xy)]/z\cdot\int \sum \frac{1}{x^2-1}$.\medskip

\begin{sfswitch}
  \noindent \emph{Sans} mode using env: $\mathbb{R,1}$
  $\alpha\beta\gamma\delta, \Re z$ and
  $\ln [\sin^{2} (xy)]/z\cdot\int \sum \frac{1}{x^2-1}$.\medskip
\end{sfswitch}

\noindent Normal: $\ln [\sin^{2} (xy)]/z\cdot\int \sum \frac{1}{x^2-1}$
{\MTversion{cabin} Sans serif:
  $\ln [\sin^{2} (xy)]/z\cdot\int \sum \frac{1}{x^2-1}$ }
Back to normal again:
$\ln [\sin^{2} (xy)]/z\cdot\int \sum \frac{1}{x^2-1}$\medskip

\noindent {\MTversion{inconsolata} This is tt mode: test quote and
  zero: "0" and then
  $\ln [\sin^{2} (xy)]/z\cdot\int \sum \frac{1}{x^2-1}$}

\end{document}

pdflatex

Lualatex由于希腊字母较粗并且坚持在衬线模式下使它们直立,因此使用时的输出看起来有点不同(但与无衬线模式的一致性还不错)。

lualatex

相关内容