有关 latex 数学字母的详细信息

有关 latex 数学字母的详细信息

我稍微了解一下 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@OMSOMS不是当前编码并且使用由编码的数学系列\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}...之间的链接。但是,这样做会产生一个新的(标准)数学字母表。实际上,在这种情况下,会执行以下代码片段:\mathrmoperators\SetMathAlphabet\mathrm{bold}...\mathrmSetMathAlphabet@

       \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

相关内容