当使用超过 16 个数学字母时,\mathtt 使用斜体字体

当使用超过 16 个数学字母时,\mathtt 使用斜体字体

我知道在 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 中。

相关内容