编辑

编辑

我最近遇到了 TeX 的“数学字母太多”错误。我试图诊断是什么占用了我的数学字母,因为我不知道它们去了哪里。当然,我可以直接开始注释掉一些部分,但考虑到这个文档有 100 页长,这可能需要一段时间长的时间。

我想知道哪些包可能正在加载数学字母表,以及哪些东西算作来自不同的数学字母表。

如果我替换

\DeclareFontFamily{OT1}{pzc}{}
\DeclareFontShape{OT1}{pzc}{m}{it}%
              {<-> s * [1.2] pzcmi7t}{}
\DeclareMathAlphabet{\mathpzc}{OT1}{pzc}%
                                 {m}{it}

\let\mathpzc\mathcal

但下面的代码编译通过,没有任何问题:

\documentclass{article}
\usepackage{kpfonts}
\usepackage{amsmath}
\usepackage[matha]{mathabx}
\DeclareFontFamily{OT1}{pzc}{}
\DeclareFontShape{OT1}{pzc}{m}{it}%
              {<-> s * [1.2] pzcmi7t}{}
\DeclareMathAlphabet{\mathpzc}{OT1}{pzc}%
                                 {m}{it}

\begin{document}
$X \mathbf{X}\mathbb{X}\vDash\mathpzc{X}\alpha\displaystyle\sum \subset \top\mathcal{X}$
\end{document}

本文档包含(据我所知)我认为自己使用过的所有类型的数学字母。所以我遗漏了一些东西。其他东西正在使用额外的数学字母,我不确定如何找出是什么。还有什么算作不同的字母?还有什么加载数学字母?


这有点奇怪。我用我的主文件的一个版本执行此操作,得到了以下结果:

(0:~jkpmn7t at 12.0pt)
(1:~jkpmi at 12.0pt)
(2:~jkpsy at 12.0pt)
(3:~jkpex at 12.0pt)
(4:~jkpmia at 12.0pt)
(5:~msam10 at 12.0pt)
(6:~msbm10 at 12.0pt)
(7:~jkpsyc at 12.0pt)
(8:~jkpexa at 12.0pt)
(9:~lasy10 at 12.0pt)
(10:~cmex10 at 12.0pt)
(11:~jkpssmn7t at 12.0pt)
(12:~jkpttmn7t at 12.0pt)
(13:~jkpbn7t at 12.0pt)
(14:~jkpsyd at 12.0pt)
(15:~jkpmn7t at 12.0pt)

请注意,015似乎是相同的字体……

编辑

我针对这个问题提出了后续问题。

答案1

数学字母是“按需”加载的;因此,这\let\mathpzc\mathcal不会导致 LaTeX 分配新的数学字母,因为分配的含义\DeclareMathAlphabet被遗忘了(并且数学字母尚未分配“数学组”)。

但是,一旦在公式中使用了数学字母,它与数学组的关联就是永久的(实际字体将根据当前字体大小重新计算)。

您可以看到在文档中的特定位置分配了哪些数学组,其\PrintMathFonts定义为

\newcommand{\PrintMathFonts}{%
  \count255=0
  \loop\ifnum\count255<16
    (\the\count255:~\fontname\textfont\count255)
    \advance\count255 by 1
 \repeat}

只有 16 个数学组可用(XeTeX 和 LuaTeX 提高了限制,但必须更改分配宏)。如果我在\begin{document}获得后立即使用它

(0:nullfont)(1:nullfont)(2:nullfont)(3:nullfont)(4:nullfont)(5:nullfont)(6:nullfont)(7:nullfont)(8:nullfont)(9:nullfont)(10:nullfont)(11:nullfont)(12:nullfont)(13:nullfont)(14:nullfont)(15:nullfont)

经过一个简单的公式,$a$我得到

(0:jkpmn7t)(1:jkpmi)(2:jkpsy)(3:jkpex)(4:jkpmia)(5:jkpsya)(6:jkpsyb)(7:jkpsyc)(8:jkpexa)(9:matha10)(10:nullfont)(11:nullfont)(12:nullfont)(13:nullfont)(14:nullfont)(15:nullfont)

经过大公式后我得到了

(0:jkpmn7t)(1:jkpmi)(2:jkpsy)(3:jkpex)(4:jkpmia)(5:jkpsya)(6:jkpsyb)(7:jkpsyc)(8:jkpexa)(9:matha10)(10:jkpbn7t)(11:pzcmi7t at 11.99997pt)(12:nullfont)(13:nullfont)(14:nullfont)(15:nullfont)

如果我还添加公式$\mathsf{A}$,我会得到

(0:jkpmn7t)(1:jkpmi)(2:jkpsy)(3:jkpex)(4:jkpmia)(5:jkpsya)(6:jkpsyb)(7:jkpsyc)(8:jkpexa)(9:matha10)(10:jkpbn7t)(11:pzcmi7t at 11.99997pt)(12:jkpssmn7t)(13:nullfont)(14:nullfont)(15:nullfont)

请注意,有些数学组在公式排版后立即分配,有些则不分配(它们对应于数学字母,而不是数学符号字体​​)。

所以您会看到已经分配了 10 个数学组,因此您可以自由使用最多 6 种不同的数学字母,这些字母不使用已经可用的符号字体中的字母(\DeclareSymbolFontAlphabet在中查找fntguide.pdf)。

编辑

上述代码的变体将在日志文件中显示列表以及字体的符号名称:

\newcommand{\PrintMathFonts}{%
  \typeout{*** Math fonts list ***}
  \count255=0
  \loop\ifnum\count255<16
    \typeout{(\the\count255: \the\textfont\count255 = \fontname\textfont\count255)}
    \advance\count255 by 1
  \repeat
  \typeout{***}}

例如,大公式后面打印的是

*** Math fonts list ***
(0: \OT1/jkp/m/n/10 = jkpmn7t)
(1: \OML/jkp/m/it/10 = jkpmi)
(2: \OMS/jkp/m/n/10 = jkpsy)
(3: \OMX/jkp/m/n/10 = jkpex)
(4: \U/jkpmia/m/it/10 = jkpmia)
(5: \U/jkpsya/m/n/10 = jkpsya)
(6: \U/jkpsyb/m/n/10 = jkpsyb)
(7: \U/jkpsyc/m/n/10 = jkpsyc)
(8: \U/jkpexa/m/n/10 = jkpexa)
(9: \U/matha/m/n/10 = matha10)
(10: \OT1/jkp/b/n/10 = jkpbn7t)
(11: \OT1/pzc/m/it/10 = pzcmi7t at 11.99997pt)
(12: \nullfont = nullfont)
(13: \nullfont = nullfont)
(14: \nullfont = nullfont)
(15: \nullfont = nullfont)
***

恐怕没有“全局注册表”,所以你必须根据你使用的软件包来整理字体。查找命令

\DeclareSymbolFont
\DeclareMathAlphabet

第一个命令声明一个始终分配的数学组;第二个命令导致数学组按需分配,如前所述。例如,条目

(10: \OT1/jkp/b/n/10= jkpbn7t)

是由\mathbf并且在kpfonts.sty你可以找到一行

\DeclareMathAlphabet{\mathbf}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}

这定义了它。

相关内容