\mathsf、\mathsfit、\mathbfsf 和 \mathbfsfit 中的希腊字母(不使用 unicode-math)

\mathsf、\mathsfit、\mathbfsf 和 \mathbfsfit 中的希腊字母(不使用 unicode-math)

现在有许多 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命令。您还必须明确写出或。\mupalphaunicode-math\mathnormal\mathit

一种更复杂的方法是加载替代的无衬线数学字体,例如

\setmathfont{Fira Math}[version=sans, Scale=MatchLowercase]

然后,您可以按照from\sanssymbol的方式定义一个命令,并使用它来执行您的命令。\boldsymbolamsbsy.cls

相关内容