我需要使用多种数学字体进行排版。据我所知,在当前版本的 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}