我有一段包含大量矢量符号的内容,因此我需要输入类似以下内容:
$\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}
当然,仍然存在用于表示标量的字母的问题;但是,在我看来,上述代码确实满足了问题的要求。