我最近遇到了 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)
请注意,0
和15
似乎是相同的字体……
编辑
答案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}
这定义了它。