\mathgroup 是什么意思?如何使用它?

\mathgroup 是什么意思?如何使用它?

我有一段包含大量矢量符号的内容,因此我需要输入类似以下内容:

$\mathbf{a}\cdot\mathbf{b}=\frac{\mathbf{a}+\mathbf{b}}{\mathbf{a}\cdot\mathbf{v}}$

(仅举例)。

到处写\mathbf命令太不方便了。所以我想定义一个命令,自动将一个\mathbf头部分配到每个原子符号中。我该怎么做?

我搜索了一个接近它的解决方案;everymath 和设置数学字体 使用\mathgroup

\everymath{\mathbf{\xdef\mysf{\mathgroup\the\mathgroup\relax}}\displaystyle\mysf}

但我不明白它的含义和工作原理。我也在谷歌上搜索了用法和机制,但没有找到。有人能给我解释一下这个命令吗?我怎样才能把这个命令变成一个更灵活的命令,让我在暂时不需要\mathgroup自动功能时可以禁用它?\mathbf

答案1

TeX 允许说

$a+{\fam4 x}$

它将a以默认的数学斜体和x分配给数学系列 4 的字体进行打印。在纯 TeX 中,这种分配是静态的,并且系列 4 被分配了文本斜体字体。

\mathbf在 LaTeX 中,分配是动态的,取决于文档和加载的数学字体包。因此,人们事先并不知道粗体字体分配给哪个系列;执行第一个命令时,分配一劳永逸。这与用 定义的所有宏相同\DeclareMathAlphabet

LaTeX 也\family有不同的调用方式,即\mathgroup;它们是同义词。

可以

\AtBeginDocument{%
  \sbox0{$\mathbf{\xdef\mathbfgroup{\the\mathgroup}}$}%
}

并且宏\mathbfgroup将保存与之对应的数学组(家庭)编号\mathbf

然而,这样做也\everymath{\mathgroup\mathbfgroup}会使全部数学中的字母以粗体显示,以及数字我相信这肯定不是你想要的。

示例代码。

\documentclass{article}

\AtBeginDocument{%
  \sbox0{$\mathbf{\xdef\mathbfgroup{\the\mathgroup}}$}%
  \everymath{\mathgroup\mathbfgroup\relax}%
}

\begin{document}

$2v+cw=u$

\end{document}

在此处输入图片描述

如你所见,你无法区分向量和标量;正确的公式应该排版为

$\mathrm{2}v+\mathnormal{c}w=u$

我非常怀疑你是否真的想这么做。

为向量定义一个宏,例如

\newcommand{\vv}[1]{\mathbf{#1}}

并输入公式

$2\vv{v}+c\vv{w}=\vv{u}$

输入更清晰,你可以\vv随意重新定义,以防你决定,毕竟,矢量应该是粗体斜体

如果你真的希望数学中的所有字母默认为粗体,那么策略是

\DeclareSymbolFont{boldfaceletters}{OT1}{cmr}{bx}{n}
\DeclareSymbolFontAlphabet{\mathbf}{boldfaceletters}
\DeclareMathSymbol{a}{\mathalpha}{boldfaceletters}{`a}
[...all letters...]
\DeclareMathSymbol{z}{\mathalpha}{boldfaceletters}{`z}
\DeclareMathSymbol{A}{\mathalpha}{boldfaceletters}{`A}
[...all letters...]
\DeclareMathSymbol{Z}{\mathalpha}{boldfaceletters}{`Z}

根据您的喜好,可能还会使用大写希腊字母。您可以使用\mathnormal或其他类似命令来更改形状。

答案2

@egreg 的回答已经给出了关于这个问题的最佳建议;无论如何,值得一提的是,当\fam/\mathgroup设置为 所使用的值时,只需将它们从类 7( ,这是 LaTeX 内核放置它们的位置)\mathbf移动到类 0( )即可保护数字不被加粗。例如:\mathalpha\mathord

\documentclass{article}

\newcommand*{\DeactivateMathAlpha}[1]{%
  % Use of e-TeX extension could also be avoided here:
  \mathcode`#1=\numexpr\mathcode`#1-"7000 \relax
}
\newenvironment*{automathbf}{%
  % A loop could also be used here:
  \DeactivateMathAlpha{0}%
  \DeactivateMathAlpha{1}%
  \DeactivateMathAlpha{2}%
  \DeactivateMathAlpha{3}%
  \DeactivateMathAlpha{4}%
  \DeactivateMathAlpha{5}%
  \DeactivateMathAlpha{6}%
  \DeactivateMathAlpha{7}%
  \DeactivateMathAlpha{8}%
  \DeactivateMathAlpha{9}%
  \everymath{\mathgroup\mathbfgroup\relax}%
}{}
\AtBeginDocument{%
  \sbox0{$\mathbf{\xdef\mathbfgroup{\the\mathgroup}}$}%
}

\begin{document}

This is the normal setting: \( 2v+cw=u \).

\begin{automathbf}
    We are now inside an \texttt{automathbf} environment: \( 2v+cw=u \).
\end{automathbf}

Back to the normal setting: \( 2v+cw=u \).

\end{document}

当然,仍然存在用于表示标量的字母的问题;但是,在我看来,上述代码确实满足了问题的要求。

相关内容