如果你有:
\documentclass{article}
\DeclareMathAlphabet {\mathbf}{T1}{futs}{bx}{n}
\begin{document}
\[
\mathbf{123}\quad\mathbf{xyz}
\]
\end{document}
然后数字 0-9 和字母 az 和 AZ 将使用 排版futs
(考虑到它们是我的命令的参数\mathbf
)。但这不是我想要的。我只希望数字 0-9 排版futs
,其余字母(字母 az 和 AZ)使用以前使用的字体排版\mathbf
(比如 LaTeX 的默认 cmr 系列)。这是我所做的:
\documentclass{article}
\usepackage{expl3,xparse}
\makeatletter
\ExplSyntaxOn
\cs_new_eq:NN \orig_mathbf:n \mathbf
\NewDocumentCommand \new@mathbf { m } {
\orig_mathbf:n {
\prg_stepwise_inline:nnnn { `0 } { \c_one } { `9 } {
\mathcode ##1 = \numexpr "100 * \symnew@mathbf@font@digits + ##1 \relax
}
#1
}
}
\DeclareSymbolFont{new@mathbf@font@digits}{T1}{futs}{bx}{n}%
\cs_set_eq:NN \mathbf \new@mathbf
\ExplSyntaxOff
\makeatother
\begin{document}
\[
\mathbf{123}\quad\mathbf{xyz}
\]
\end{document}
到目前为止,经过我的测试,这种方法效果很好,但它有一个重要的副作用:它使用了更多的数学字母表。所以我的问题是,有没有更好的方法可以在不使用新数学字母表的情况下完成我想要做的事情?
答案1
数学字母表的理念是在公式中提供特定设计的数字和基本字母字符。虽然公式中的大多数字符都有固定的表示形式(即取自固定的符号字体),但数字和字母字符可以通过选择不同的数学字母表来改变其外观。
从技术上讲,公式中的每个符号都来自一个数学系列(字体),最多有 16 个这样的系列。特殊之处在于,某些符号可以标记为“变量符号”,这样当它们出现在数学字母表命令范围内时,它们将从与数学字母表关联的数学系列中获取。
哪些数学字体系列与哪些字体相关联可以根据每个公式进行更改(这就是它将\boldmath
映射更改为粗体字体的原因),但在公式中,数学字体系列和真实字体之间的关联是固定的。
对于从固定位置的“符号字体”中取出的符号,必须预先定义数学字体系列,因为这些命令\times
只是定义为“在插槽位置 Y 中拾取数学字体系列 X 的字形”。数学字母的情况有所不同,当首次使用它们时,它们可以在数学字体系列和某些外部字体之间建立关联,然后选择该数学系列并使用它。
这并不能使我们绕过 16 个数学家族的最大限制,但它使我们能够提供更多的替代方案,并且仅在实际使用时从中进行选择。
关于一般背景就这么多。
现在,如果由于某种原因,数学字母表实际上应该由多种字体构成(例如,数字来自一种字体,字母来自另一种字体),那么可用的选项并不多:
最有效的方法可能是构建一个虚拟字体,以所需的方式组合两种字体的字形。结果,对于 TeX,我们最终得到一个需要单个数学字母表的字体。
如果打算在 TeX/LaTeX 中使用技术解决方案,那么实现这一目标的唯一方法就是按照问题中所建议的思路,即
- 将一组“变量符号”局部转化为指向某个符号字体的固定符号。
- 但是,该符号字体必须作为单独的数学字体系列提供,因此,除非出于某种原因已经加载,否则必须(预先)声明它,这样就可以吹走另一个数学字体系列
- 该方法的另一个缺点当然是每次
\mathbf
使用时都必须进行所有这些重新定义......幸运的是,现在的计算机速度更快了。
因此,归根结底,问题中的方法在很大程度上是 TeX 中唯一的方法(当然,实现方式可以不同)。更快的解决方案是定义两个数学字母表,一个用于粗体字母,一个用于粗体数字(避免内部重新映射),但如果想法是假装只有字体,\mathbf
并且字体的更改只是出于某种美学原因(这可能是一个足够有效的理由),那么上述解决方案或类似方法或使用虚拟字体是可行的方法。