修复 `bm` 和 NFSS 的交互

修复 `bm` 和 NFSS 的交互

我正在尝试以更不脆弱的方式将数学加粗bm。(与这个答案的最后几段

然而,经过几个小时阅读 NFSS 的源代码(这不是第一次!甚至可能不是第十次!)每次看起来我的理解都不足以预测什么会起作用(使用“数学版本”),什么不会起作用。特别是,下面的最小示例似乎有效,但我无法解释原因——所以我不知道它是否会在更复杂的情况下继续发挥作用。

问题:

  1. 如何解释为什么下面标记的代码部分works only if…有效?

  2. 有没有更强大的方法来提取\mathfrak当前处于活动状态的“数学字母”(如)?

谢谢!

\documentclass{amsart}
\usepackage{bm}

\makeatletter
\def\grabCurFam#1#2{%   A replacement for \install@mathalphabet \mathbf {DEF} DEF=\select@group 4args OR ...\use@mathgroup \M@U {10}
    \grabCurFamA {#1}#2\use@mathgroup{}{-10}\@nil       % -10 is not a valid
  }
\def\grabCurFamA #1#2\use@mathgroup#3#4#5\@nil{%
    \ifnum #4>-10 %
      \ifnum \the\fam = #4 \gdef\grabbedAlphabet{#1}%       \show #1%
      \fi
    \fi
  }
\def\grabMathAlphabet{%
  \begingroup           % does not create an empty math atom???
  \xdef\grabbedAlphabet{\noexpand\fam\the\fam       % works only if family number is the same in normal/bold math versions,
                                                        % and the font is already preloaded.  However, in simplest examples these
                                                        % conditions actually seam to hold.
                  \noexpand\PackageWarning{--inline--}{Could not grab the current math alphabet for math version=\the\fam}}%
  \let\install@mathalphabet\grabCurFam
  \let\getanddefine@fonts\@gobbletwo
  \csname mv@\math@version\endcsname
  \PackageWarning{--inline--}{got: \meaning\grabbedAlphabet}%
  \endgroup
}
\makeatother

\bmdefine\BgSimple{g}
\bmdefine\BgHairy{{\grabbedAlphabet{g_{\text{\the\fam}}}}}  % Infinite loop without enclosing braces!!! ???
\def\gBM{\ifnum\the\fam<0 \expandafter\BgSimple\else{}_{\text{\the\fam}}\grabMathAlphabet\expandafter\BgHairy\fi}

\begin{document}
%\tracingall

% To debug: preloading frak breaks the match of the family numbers between normal/bold math versions.
$\vphantom{\mathfrak{g}}  1 g \gBM$

$2 \mathrm{g \gBM}$

$2' \mathsf{g \gBM}$

$2'' \mathcal{g \gBM}$

$2''' \mathfrak{g \gBM}$

\end{document}

截屏(下标是数学家族数字)

答案1

通常,您需要的方法是加载单独的粗体字母,例如\mathbfcal粗体书法和\mathbfit粗体斜体。各个软件包的名称略有不同,因此请查看文档。

如果您能够使用 LuaLaTeX 或 XeLaTeX,我建议使用 编写新文档unicode-math

如果您需要或更喜欢使用 PDFLaTeX,并且需要所有这些字母,那么一个好的解决方案是同时加载isomath(用于粗体和无衬线数学字母,包括希腊文)和mathalfa(用于手写体、书法、Fraktur 和双击)。两者都提供了一套全面的 NFSS 字体。

另一种方法是mathastext,它还允许您使用任何旧式文本字体以及任何 LGR 编码的希腊字体来表示数学字母。

我不知道当您声明一个新的自定义数学字母表时任何解决方案仍然有效。

相关内容