TeX 16 种数学字体的限制

TeX 16 种数学字体的限制

我需要使用多种数学字体进行排版。据我所知,在当前版本的 TeX 中,每个数学版本只能有 16 种数学字体,而且无法更改此设置。一种潜在的解决方案是使用 \usefont单独分配每个所需的字形。但是,当涉及到整个字体集合时,它会变得非常低效。

我打算定义新的数学版本,例如\boldmath,然后将新字体归于每个数学模式,这样就可以克服 16 种字体的限制。有没有系统的方法来达到这个目标?

答案1

LaTeX 可以让你宣布超过 16 种数学字体。

您可以声明超过 16 种字体 \DeclareMathAlphabet ,但只有在文档中实际使用时,才会分配并占用 16 种字体中的一种。因此,您可以有一个声明 fraktur、script 和 bold italic 等的包……除非用户实际尝试在同一文档中使用它们,否则这是可以的。

符号字体的分配有所不同。出于效率原因,它们按照声明的方式分配,以便在定义字符时可以使用数值 0-16。

因此,将最多字体添加到数学版本中的一种方法是不是要使用数学字母,只需使用 16 个系列的符号字体即可。然后使用\textit而不是并以类似的方式为您需要的任何其他数学字母 \mathit 定义版本,并使用相同的字体,但前者通过文本模式访问字体,因此不会用尽 16 个数学组中的一个。\text..\textit\mathit

当然,也可以使用 xelatex 或 lulatex,其中每种字体可以有 100 万个字符(从 256 个字符增加到 100 万个字符),并且每个数学列表中可以有 256 个字符(从 16 个字符增加到 256 个字符),因此用尽插槽的可能性要小得多。


如果您使用 xetex 或 luatex,则可以使用 256 个而不是 16 个槽。您只能使用\mathchardef前 16 个槽,因此最好限制\DeclareSymbolFont在该范围内,但数学字母可以使用整个范围。

该文档除了标准符号字体外,还包含 17 种数学字母,总共约 20 种。

在此处输入图片描述

\makeatletter从 2015 年起,LaTeX 版本不再需要以下之间的重新定义\makeatother。新的 LaTeX 格式可检​​测 xetex 或 luatex,并允许使用 256 个数学字母,而无需任何额外定义。

\makeatletter
\ifx\e@alloc\@undefined
\def\new@mathgroup{\alloc@8\mathgroup\chardef\@cclvi}
\let\newfam\new@mathgroup
\fi

\def\select@group#1#2#3#4{%
 \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi
 {%
 \ifmmode
  \ifnum\csname c@mv@\math@version\endcsname<256 %\sixt@@n
     \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}%
 }%
}
\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<256 %\sixt@@n
     \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\DeclareSymbolFont#1#2#3#4#5{%
 \@tempswafalse
 \edef\reserved@b{#2}%
 \def\cdp@elt##1##2##3##4{\def\reserved@c{##1}%
      \ifx\reserved@b\reserved@c \@tempswatrue\fi}%
 \cdp@list
 \if@tempswa
   \@ifundefined{sym#1}{%
%% only allow symbol fonts below 16
      \ifnum\count18<15 %
        \expandafter\new@mathgroup\csname sym#1\endcsname
        \expandafter\new@symbolfont\csname sym#1\endcsname
                        {#2}{#3}{#4}{#5}%
      \else
         \@latex@error{Too many symbol fonts declared}\@eha
      \fi
     }%
     {%
      \@font@info{Redeclaring symbol font `#1'}%
      \def\group@elt##1##2{%
           \noexpand\group@elt\noexpand##1%
           \expandafter\ifx\csname sym#1\endcsname##1%
             \expandafter\noexpand\csname#2/#3/#4/#5\endcsname
           \else
               \noexpand##2%
           \fi}%
      \xdef\group@list{\group@list}%
      \def\version@elt##1{%
          \expandafter
          \SetSymbolFont@\expandafter##1\csname#2/#3/#4/#5\expandafter
              \endcsname \csname sym#1\endcsname
          }%
      \version@list
     }%
  \else
    \@latex@error{Encoding scheme  `#2' unknown}\@eha
  \fi
  }

\makeatother
\documentclass{article}
\usepackage{amsfonts,amssymb}
\usepackage[mathscr]{euscript}
\DeclareSymbolFont{bsymbols}     {OMS}{cmsy}{b}{n}
\DeclareMathAlphabet{\mathrs}{U}{rsfso}{m}{n}
\DeclareMathAlphabet{\mathbbx}{U}{bbold}{m}{n}
\DeclareMathAlphabet{\mathbit}{OT1}{cmr}{bx}{it}
\DeclareMathAlphabet{\mathbsf}{OT1}{cmss}{bx}{n}
\DeclareMathAlphabet{\mathtm}{OT1}{ptm}{m}{n}
\DeclareMathAlphabet{\mathbtm}{OT1}{ptm}{bx}{n}
\DeclareMathAlphabet{\mathdh}{OT1}{cmdh}{m}{n}
\begin{document}


$
1+2\left(\sum\limits_0^nx_i\right\}
A
\mathit{A}
\mathbit{A}
\mathtt{A}
\mathsf{A}
\mathbsf{A}
\mathrm{A}
\mathbf{A}
\mathscr{A}
\mathbb{A}
\mathbbx{A}
\mathcal{A}
\mathfrak{A}
\mathrs{A}
\mathtm{A}
\mathbtm{A}
\mathdh{A}
$

\end{document}

相关内容