现在有许多 OpenType 数学字体(或字体系列)可用于希腊无衬线字母,包括直立/斜体和常规/粗体的所有组合。Stix 2 就是一个典型的例子(尽管目前非粗体字符属于私人使用区域)。根据周围的命令(标题中列出的命令),让正确形式的希腊字符与其拉丁字符一起出现有多难?换句话说,\mathsf{a\alpha b\beta c\gamma}
应该显示为
根据这里提供的答案,我已经非常接近完成这一目标:数学表达式中的无衬线和衬线希腊字体。事实上,我使用了这些方法(unicode 版本)来生成上述表达式(拉丁语是 Tex Gyre Heros,希腊语是 Stix Two,均为 OTF)。但是一旦遇到更复杂的表达式(例如涉及指数的表达式,比如)\mathsf{k^{\alpha}}
,这种方法就会失败。我不认为这会很容易,但似乎值得付出努力。
笔记: 我愿意不是希望使用,unicode-math
因为我正在使用它mtpro2
作为我的主要数学字体,但尚未准备好更改它。我意识到这意味着标题中的所有命令都需要定义(使用 给出unicode-math
,否则则不是)。
到目前为止,我所写的内容都是以包的形式。由于其中大部分都是\Umathchardef
命令,因此我将在下文中省略大部分命令以使其简短。此外,我只包括常规直立部分,因为其他三个是类似的。目前,同时接受拉丁语和希腊语的命令是\sxgksfup
。我可以稍后再考虑重命名它。
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{Stix2OTFSansGreek}[07/07/2023]
\newfontfamily\StixTwoGkSfUp{STIXTwoMath-Regular.otf}[NFSSFamily=stixgksfup,Script=Math,Scale=MatchLowercase]
\DeclareSymbolFont{gksfup}{TU}{stixgksfup}{m}{n}
\newfontface\StixTwoGkSfIt{STIXTwoMath-Regular.otf}[NFSSFamily=stixgksfit,Script=Math,Scale=MatchLowercase]
\DeclareSymbolFont{gksfit}{TU}{stixgksfit}{m}{n}
\newfontface\StixTwoGkBfSfUp{STIXTwoMath-Regular.otf}[NFSSFamily=stixgkbfsfup,Script=Math,Scale=MatchLowercase]
\DeclareSymbolFont{gkbfsfup}{TU}{stixgkbfsfup}{m}{n}
\newfontface\StixTwoGkBfSfIt{STIXTwoMath-Regular.otf}[NFSSFamily=stixgkbfsfit,Script=Math,Scale=MatchLowercase]
\DeclareSymbolFont{gkbfsfit}{TU}{stixgkbfsfit}{m}{n}
\Umathchardef\rsualpha "0 \symgksfup "0E196
\Umathchardef\rsubeta "0 \symgksfup "0E197
\Umathchardef\rsugamma "0 \symgksfup "0E198
\Umathchardef\rsuvarTheta "0 \symgksfup "0E18E
\Umathchardef\rsunabla "0 \symgksfup "0E1F6
\def\ifiscseq#1{\ifcat$\expandafter\@gobble\string#1$\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}
\def\gk@@sfup#1#2\@nil{%
\ifiscseq{#1}{\ifcsdef{rsu\@xp\@gobble\string#1}{\csname rsu\@xp\@gobble\string#1\endcsname}{#1}}{%not a cs
\mathsf{#1}}
\ifblank{#2}{\relax}{\gk@@sfup #2\@nil}}
\DeclareRobustCommand*{\sxgksfup}[1]{\gk@@sfup#1\@nil}
产生的错误\sxgksfup{k^{\alpha}}
如下。
! Missing { inserted.
<to be read again>
\egroup
l.866 \end{align*}
A left brace was mandatory here, so I've put one in.
You might want to delete and/or insert some corrections
so that I will find a matching right brace soon.
(If you're confused by all this, try typing `I}' now.)
! Missing } inserted.
<inserted text>
}
l.866 \end{align*}
I've put in what seems to be necessary to fix
the current column of the current alignment.
Try to go on, since this might almost work.
这重复了很多次。当然,这可能只适用于特定表达式。我希望这适用于任何表达式。
最后,将命令的最后两个参数分别修改\DeclareSymbolFont
为{m}{n}
、{m}{it}
、{b}{n}
和是否有好处{b}{it}
?
答案1
您不需要多种字体,只需要一种,而是将要从unicode数学块中取出的字符移开,例如
https://w3c.github.io/xml-entities/bold.html
也就是说,您需要\symxx
来自unicode math。我在这里只显示三种样式,math italic、upright 和 upright bold,仅用于 a 和 alpha。
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\StixTwoMath[NFSSFamily=stix,Script=Math,Scale=MatchLowercase]{STIXTwoMath-Regular.otf}
\DeclareSymbolFont{stix}{TU}{stix}{m}{n}
\def\alpha{^^^^03b1}
\Umathcode`a = 0 \symstix "1D44E % a
\Umathcode"03B1=0 \symstix "1D6FC % alpha
\def\symup#1{%
\begingroup
\Umathcode`a = 0 \symstix `a % a
\Umathcode"03B1=0 \symstix "03B1 % alpha
#1%
\endgroup
}
\def\symbf#1{%
\begingroup
\Umathcode`a = 0 \symstix "1D41A % a
\Umathcode"03B1=0 \symstix "1D6C2 % alpha
#1%
\endgroup
}
\begin{document}
$
a \alpha a^{\alpha}
+
\symup{a \alpha a^{\alpha}}
+
\symbf{a \alpha a^{\alpha}}
$
\end{document}
答案2
如果你想解决 Unicode 中缺少某些希腊字母的问题,更好的方法是\setmathfontface
,例如
\setmathfontface\altsfup{CMU Bright}[Scale=MatchLowercase]
\setmathfontface\altsfit{CMU Bright Oblique}[Scale=MatchLowercase]
让你写
$\altsfit{\mupalpha}$
\mup
请注意,即使您想要斜体,此方法也仅适用于命令的形式。该包将 Unicode 希腊字母映射到这些字母,并具有\alpha
尝试检测当前数学字母表等命令,以阻止以这种方式覆盖它。您还可以输入 UTF-8 文字。
另一种方法是定义
\newcommand\mathsf[1]{\mathord{\textnormal{\sffamily #1}}}
然后,您必须使用 等,插入文字 UTF-8 α,或定义类似from 的\textalpha
命令。您还必须明确写出或。\mupalpha
unicode-math
\mathnormal
\mathit
一种更复杂的方法是加载替代的无衬线数学字体,例如
\setmathfont{Fira Math}[version=sans, Scale=MatchLowercase]
然后,您可以按照from\sanssymbol
的方式定义一个命令,并使用它来执行您的命令。\boldsymbol
amsbsy.cls