我稍微了解一下 nfss 如何用于文本字体,但我很难理解latex.ltx
数学字体的代码(而且那里的文档source2e.pdf
有点稀疏)。因此我有一些问题:
\mathcal
如果我递归地查看 eg via的定义,latexdef
我会得到
\mathcal : macro:->\relax \ifmmode \else \non@alpherr \mathcal \fi \use@mathgroup \M@OMS \symsymbols
\use@mathgroup: macro:#1#2->\relax \ifmmode \math@bgroup \expandafter \ifx \csname M@\f@encoding \endcsname #1\else #1\fi \mathgroup #2\relax \expandafter \math@egroup \fi
\mathgroup: \fam
据我理解\T@OMS
,和\M@OMS
分别是在和中指定的加载代码,
\DeclareFontEncoding {encoding} {text-settings} {math-settings}
默认情况下不执行任何操作。
因此本质上在数学模式中\mathcal
切换到\M@OMS
的OMS
不是当前编码并且使用由编码的数学系列\symsymbols
,这是有意义的,因为\mathcal
它是通过定义的
\DeclareSymbolFontAlphabet{\mathcal}{symbols}
。
因为\mathit
这一旦被使用,本质上就是一样的,并且 在第一次使用\select@group \mathit \M@OT1 \OT1/cmr/m/it
时会创建一个具有这种字体的数学组。\mathit
但我遗漏了一些东西。例如,在 中\mathrm{ab-de}
仍然-
排版为运算符而不是字体rm
。所以我猜\mathrm
只更改了某些字母的数学代码以使用相应的symoprators
数学系列,但不是全部,而且我在源代码中找不到在哪里。
第二个问题:由于是\mathrm
通过\DeclareSymbolFontAlphabet{\mathrm}{operators}
如果我们同时执行 a\SetSymbolFont{operators}{bold}...
和 a会发生什么来定义的\SetMathAlphabet\mathrm{bold}...
?这些是否等效,都改变了\symoperators
数学版本粗体中的数学组?
答案1
所有的工作\mathrm
最终归结为\fam=n
,其中n
代表一个字节整数(从0到15),在一组默认值为 0,因为\mathrm
是通过定义的
\DeclareSymbolFontAlphabet{\mathrm}{operators}
并且fontmath.ltx
\DeclareSymbolFont{operators}{OT1}{cmr}{m}{n}
就像它一样第一的符号字体的声明。此类声明稍后可被字体包覆盖,但operators
始终指向数学系列 0。
\mathrm
在执行过程中不数学码改变。如果字符有数学码"7xyz
(最高有效字节为 7),则"yz
如果 的当前值\fam
介于 0 到 15 之间,则 TeX 将在当前数学系列的字体槽中排版该字符,这是 TeX 的一个原始特性。否则,该字符将使用数学系列的字体"x
。
旁注:LaTeX 定义\mathgroup
为 的别名\fam
。
事实上,我们已经fontmath.ltx
\DeclareMathSymbol{a}{\mathalpha}{letters}{`a}
其他字母也类似。这是 LaTeX 术语,表示纯 TeX 中的相应声明
\mathcode`a="7197
因为 的声明letters
是 中的第二个fontmath.ltx
,所以对应于数学家族 1。
由于没有改变数学代码并被-
声明为
\DeclareMathSymbol{-}{\mathbin}{symbols}{"00}
对应于\mathcode`-="2300
,它不会受到 的当前值的影响\fam
。
宏\operatorname
确实amsmath
改变了数学代码,使其-
看起来像一个真正的连字符。
答案2
关于我的第二个问题:
第二个问题:由于 \mathrm 是通过 \DeclareSymbolFontAlphabet{\mathrm}{operators} 定义的,如果我们同时执行 \SetSymbolFont{operators}{bold}... 和 \SetMathAlphabet\mathrm{bold}... 会发生什么?它们是否等效,都改变了数学版本粗体中的 \symoperators 数学组?
我现在可以回答了。使用更新粗体版本的运算符号的字体,并保持和\SetSymbolFont{operators}{bold}...
之间的链接。但是,这样做会产生一个新的(标准)数学字母表。实际上,在这种情况下,会执行以下代码片段:\mathrm
operators
\SetMathAlphabet\mathrm{bold}...
\mathrm
SetMathAlphabet@
\edef\reserved@a{%
\noexpand\in@{\string\use@mathgroup}{\meaning#4}}%
\reserved@a
\ifin@ % if we were a symbol font alphabet
\def\reserved@b##1\use@mathgroup##2##3{%
\def\reserved@b{##3}\def\reserved@c{##2}}%
\expandafter\reserved@b#4% reserved@b now holds the value of the symbol math group, and reserved@c is M@enc
\begingroup
\def\install@mathalphabet##1##2{%
\addto@hook\toks@{\install@mathalphabet##1{##2}}%
}% we copy the existing alphabets
\def\getanddefine@fonts##1##2{% we copy the existing symbol fonts
\addto@hook\toks@{\getanddefine@fonts##1##2}%
\ifnum##1=\reserved@b %if the symbol font is the one we are replacing, use it to set up the font of our new alphabet
\expandafter
\addto@hook\expandafter\toks@
\expandafter{\expandafter\install@mathalphabet
\expandafter#4\expandafter
{\expandafter\select@group\expandafter
#4\reserved@c##2}}%
\fi
}%
\def\version@elt##1{%
\toks@{}%
##1%
\xdef##1{\the\toks@}%
}%
\version@list
\endgroup
\expandafter\gdef\expandafter\alpha@list\expandafter
{\alpha@list
\alpha@elt #4\no@alphabet@error \no@alphabet@error}%
\gdef#4{\no@alphabet@error #5}% fake things :-)
\SetMathAlphabet@{#1}{#2}{#3}#4#5% set up the font requested for this version
因此我们看到我们得到了一个新的\mathrm
标准字母表,没有默认值(即\no@alphabet@error
),但是当前数学版本中的现有字体定义operators
被复制\mathrm
(当然指定的版本SetMathAlphabet
被更新)。
考虑 的结果latexdef -o '\SetMathAlphabet{\mathrm}{bold}{T1}{lmr}{xb}{sc}' 'mv@bold'
,我们得到的\install@mathalphabet \mathrm {\select@group \mathrm \M@T1 \T1/lmr/xb/sc }
正如预期的那样。更有趣的是, 的结果latexdef -o '\SetMathAlphabet{\mathrm}{bold}{T1}{lmr}{xb}{sc}' 'mv@normal'
产生了\mathrm {\select@group \mathrm \M@OT1 \OT1/cmr/m/n }
。我们看到,正常模式下新字母的字体\mathrm
是从符号字体的值复制而来的operators
。