有人可能会这样定义 \mathbf:
\DeclareMathAlphabet {\mathbf}{OT1}{cmr12}{bx}{n}
那么,我想知道 \mathbf 将如何定义?(它的含义是什么?)。
答案1
与其直接看\meaning
、、或\show
类似的代码\tracingall
,不如阅读有关 NFSS 的主要文章(然后新字体选择方案)。它们现在有点老了(1989 :-)),所以它们早于 LaTeX2e 甚至 TeX3,但我认为它们会给你一些关于底层概念的想法,尤其是第一个。但请注意,这些论文描述了 NFSS 的初始版本。对于 LaTeX2e,一些接口已经更改,我们进一步优化了代码以提高速度和紧凑性。
当前代码(及其文档)可以在 LaTeX 发行版中找到,查找名为ltfss
某物.dtx
并对其进行排版。它们有相当好的文档记录(大致如此),但文档记录主要涉及微观层面,而不是大局。
答案2
通过 LaTeX 运行以下命令
\makeatletter
\show\mathbf
\expandafter\show\csname mathbf \endcsname
\show\select@group
\expandafter\show\csname M@OT1\endcsname
\show\default@M
你会得到
> \mathbf=macro:
->\protect \mathbf .
> \mathbf =macro:
->\select@group \mathbf \M@OT1 \OT1/cmr/bx/n .
> \select@group=macro:
#1#2#3#4->\ifx \math@bgroup \bgroup \else \relax \expandafter \@firstofone \fi
{\ifmmode \ifnum \csname c@mv@\math@version \endcsname <\sixt@@n \begingroup \e
scapechar \m@ne \getanddefine@fonts {\csname c@mv@\math@version \endcsname }#3\
globaldefs \@ne \math@fonts \endgroup \init@restore@version \xdef #1{\noexpand
\use@mathgroup \noexpand #2{\number \csname c@mv@\math@version \endcsname }}\gl
obal \advance \csname c@mv@\math@version \endcsname \@ne \else \let #1\relax \@
latex@error {Too many math alphabets used in version \math@version }\@eha \fi \
else \expandafter \non@alpherr \fi #1{#4}}.
> \M@OT1=macro:
->\default@M .
> \default@M=macro:
->.
这确实很可怕,但也不是太可怕。
当然,最主要的是\select@group
,它必须检查相应的数学组(TeXbook 术语中的数学系列)是否已经分配。然后,它基本上打开一个组,设置数学组并排版参数,除非命令是在数学模式之外给出的。