![当使用超过 16 个数学字母时,\mathtt 使用斜体字体](https://linux22.com/image/251554/%E5%BD%93%E4%BD%BF%E7%94%A8%E8%B6%85%E8%BF%87%2016%20%E4%B8%AA%E6%95%B0%E5%AD%A6%E5%AD%97%E6%AF%8D%E6%97%B6%EF%BC%8C%5Cmathtt%20%E4%BD%BF%E7%94%A8%E6%96%9C%E4%BD%93%E5%AD%97%E4%BD%93.png)
我知道在 TeX 中只能使用 16 个数学字母,但 XeTeX 扩展了这一点,所以我很好奇如何扩大我的数学字母的数量,并且不得不重新定义 LaTeX 的一些内部结构。这是我的最小工作示例:
\documentclass{article}
\DeclareSymbolFont{AMSa}{U}{msa}{m}{n}
\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}
\DeclareSymbolFont{MnSyA} {U} {MnSymbolA}{m}{n}
\DeclareSymbolFont{MnSyB} {U} {MnSymbolB}{m}{n}
\DeclareSymbolFont{MnSyC} {U} {MnSymbolC}{m}{n}
\DeclareSymbolFont{MnSyD} {U} {MnSymbolD}{m}{n}
\DeclareSymbolFont{MnSyE} {U} {MnSymbolD}{m}{n}
\makeatletter
\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}%
}%
}
\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}%
}%
}
\makeatother
\DeclareSymbolFont{testa} {U}{cmr10} {m}{n}
\DeclareSymbolFont{testb}{U}{cmr10}{bx}{n}
\DeclareSymbolFont{testc}{U}{cmr10}{m}{it}
\DeclareSymbolFont{testd}{U}{cmr10}{m}{n}
\DeclareSymbolFont{lettersA}{U}{txmia}{m}{it}
\begin{document}
\[ \mathtt{Test}\]
\end{document}
但这会使单词test
显示为斜体。您可以删除任何内容,\DeclareSymbolFont
然后\mathtt
按预期工作。这表明只有当数学字母的数量超过 16 时才会发生这种情况。为什么会发生这种情况,应该如何解决?
更新1:我尝试用 LuaTeX 做同样的事情,得到了预期的结果,所以看起来 XeTeX 出了问题。
更新2:另一个最小工作示例:
\documentclass{article}
\usepackage{amsfonts}
\usepackage{MnSymbol}
\makeatletter
\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}%
}%
}
\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}%
}%
}
\makeatother
\DeclareSymbolFont{testa}{U}{txmia}{m}{it}
\DeclareSymbolFont{testb}{U}{txmia}{m}{it}
\DeclareSymbolFont{testc}{U}{txmia}{m}{it}
\DeclareSymbolFont{testd}{U}{txmia}{m}{it}
\DeclareSymbolFont{lettersA}{U}{txmia}{m}{it}
\begin{document}
\[ \mathtt{Test} \mathcal{L}\]
\end{document}
LuaLaTeX 没有问题,但使用 XeLaTeX,这次,\mathtt
没问题,但你会得到斜体\mathcal
。
答案1
XeTeX 的\fam
原语似乎尚未扩展以接受更高的值,并且由于旧式数学代码格式也允许更高的系列(例如使用\mathchar
和\mathcode
),因此目前访问更高数学系列的唯一方法是通过扩展数学原语。一个更简单的测试:
\tracingonline=1
\font\cmscten=cmcsc10 at 10pt
\font\dunhten=cmdunh10 at 10pt
\textfont15=\cmscten
\textfont16=\dunhten
$$
\fam15 a
\fam16 A
\XeTeXmathchar"0 16 `A
\showlists
$$
\bye
即使\fam
已扩展,使用高级数学系列与旧数学设置仍然不可靠,因为其他数学原语(如\mathchar
和\mathcode
)存在限制,无法以向后兼容的方式进行扩展,因此现有软件包在与高级数学系列一起使用时会出现意外运行。此外,扩展数学原语不能直接替代某些旧数学原语,例如\XeTeXdelcode
不能用作替代,\delcode
因为它需要 OpenType 数学字体,并且无法按预期与旧数学字体配合使用。
因此,出于所有实际目的,应保留对 LaTeX 内核的检查,除非正在转向仅 Unicode/OpenType 的数学设置,其中可以可靠地使用更高的数学系列(但那时不太可能需要超过 16 个,因为 Unicode/OpenType 需要的比传统设置\fam
少得多)。\fam
更新:在 XeTeX 中git 存储库,\fam
现在可以正确处理小于 256 的数字,并且\showthe\textfont
问题(由 Enrico 指出)已得到很好的修复,并且两个修复现在都包含在 TeX Live 2012 中。