在一个文档中我需要同时使用 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}
答案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}
Lualatex
由于希腊字母较粗并且坚持在衬线模式下使它们直立,因此使用时的输出看起来有点不同(但与无衬线模式的一致性还不错)。