重要提示

重要提示

有时我会收到一条消息:

!LaTeX 错误:正常版本中使用了太多数学字母。

我知道一篇文章最多只能使用 16 个字母。但是这条消息规定版本正常那么还有其他版本的 LaTeX 允许使用超过 16 个字母吗?

答案1

您可以在 XeLaTeX 或 LuaLaTeX 中使用超过 16 个数学组(特别是数学字母);下面是示例。当然,还必须更改分配机制。

\documentclass{article}
\makeatletter
\def\new@mathgroup{\alloc@8\mathgroup\mathchardef\@cclvi}
\def\document@select@group#1#2#3#4{%
 \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi
 {%
 \ifmmode
   \ifnum\csname c@mv@\math@version\endcsname<\@cclvi
     \begingroup
       \escapechar\m@ne
       \getanddefine@fonts{\csname c@mv@\math@version\endcsname}#3%
       \globaldefs\@ne  \math@fonts
     \endgroup
     \expandafter\extract@alph@from@version
         \csname mv@\math@version\expandafter\endcsname
         \expandafter{\number\csname
                       c@mv@\math@version\endcsname}%
          #1%
     \global\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}%
 }%
}
\def\select@group#1#2#3#4{%
 \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi
 {%
 \ifmmode
  \ifnum\csname c@mv@\math@version\endcsname<\@cclvi
     \begingroup
       \escapechar\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}}%
     \global\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}%
 }%
}
\makeatother
\DeclareMathAlphabet{\mA}{OT1}{pcr}{m}{n}
\DeclareMathAlphabet{\mB}{OT1}{pcr}{m}{it}
\DeclareMathAlphabet{\mC}{OT1}{pcr}{b}{n}
\DeclareMathAlphabet{\mD}{OT1}{pcr}{b}{it}
\DeclareMathAlphabet{\mE}{OT1}{ptm}{m}{n}
\DeclareMathAlphabet{\mF}{OT1}{ptm}{m}{it}
\DeclareMathAlphabet{\mG}{OT1}{ptm}{b}{n}
\DeclareMathAlphabet{\mH}{OT1}{ptm}{b}{it}
\DeclareMathAlphabet{\mI}{OT1}{pag}{m}{n}
\DeclareMathAlphabet{\mJ}{OT1}{pag}{m}{it}
\DeclareMathAlphabet{\mK}{OT1}{pag}{b}{n}
\DeclareMathAlphabet{\mL}{OT1}{pag}{b}{it}
\DeclareMathAlphabet{\mM}{OT1}{pbk}{m}{n}
\DeclareMathAlphabet{\mN}{OT1}{pbk}{m}{it}
\DeclareMathAlphabet{\mO}{OT1}{pbk}{b}{n}
\DeclareMathAlphabet{\mP}{OT1}{pbk}{b}{it}

\begin{document}
$
\mathbf{X}
\mathit{X}
\mathsf{X}
\mathtt{X}
\mA{X}
\mB{X}
\mC{X}
\mD{X}
\mE{X}
\mF{X}
\mG{X}
\mH{X}
\mI{X}
\mJ{X}
\mK{X}
\mL{X}
\mM{X}
\mN{X}
\mO{X}
\mP{X}
$
\end{document}

人们可以不用复制所有那些东西,而使用一个更简单的补丁;下面的代码应该替换前一个代码中的所有内容\makeatletter\makeatother

\usepackage{etoolbox}
\makeatletter
\def\new@mathgroup{\alloc@8\mathgroup\mathchardef\@cclvi}
\patchcmd{\document@select@group}{\sixt@@n}{\@cclvi}{}{}
\patchcmd{\select@group}{\sixt@@n}{\@cclvi}{}{}
\makeatother

xelatex使用或编译文档lualatex将会显示以下恐怖情况;当然你会有更好的用例。

在此处输入图片描述

重要提示

正如 Khaled Hosny 非常正确指出的那样,有一个非常重要的限制:这可能有效仅有的对于数学字母表;无法定义\mathchar使用扩展集的值(应使用 XeTeX 或 LuaTeX 扩展)。因此,在使用必须加载到内存中的数学符号字体​​时必须小心数学字母表。因此,如果stmaryrd加载了,最好确保在使用新的数学字母表之前对使用它的公式进行排版;\sbox0{$\Ydown$}序言中的应该足够,因为这样将永久为分配一个数学组stmaryrd

相关内容