当使用纯 TeX 时,如何在数学模式下使用罗马字体表示大写字母?

当使用纯 TeX 时,如何在数学模式下使用罗马字体表示大写字母?

法语样式(参见frenchstyleLaTeX kpfonts 包的选项)是在数学模式下排版大写字母罗马而不是斜体。

我怎样才能在纯 TeX 中实现这一点,而不必到处手动输入\rm?也就是说,我希望第二个看起来像第一个:

  • Let $\rm V$ be a vector space.
  • Let $V$ be a vector space.

答案1

您需要更改大写字母的数学代码。在plain.tex您找到

% INITEX sets up \mathcode x=x, for x=0..255, except that
% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
% \mathcode x=x+"7000, for x = `0 to `9.

但是您想要的"7000,第二位数字表示从中获取字符的默认数学系列,并且0用于直立文本字体。

如何以尽可能少的工作来做到这一点?

\count255=`A
\count8="7000
\advance\count255 by -1
\loop\ifnum\count255<`Z
  \advance\count255 by 1
  \advance\count8 by 1
  \mathcode\count255=\count8
\repeat
% cover your tracks
\count8=0

$A+B+\Gamma+Z+a+b+z$

${\mit A}+A$

\bye

在此处输入图片描述

如果你使用pdftex,可以缩短为

\count255=`A
\advance\count255 by -1
\loop\ifnum\count255<`Z
  \advance\count255 by 1
  \mathcode\count255=\numexpr\count255+"7000\relax
\repeat

甚至更短expl3(也需要pdftex):

\input expl3-generic
\ExplSyntaxOn
\int_step_inline:nnn { `A } { `Z }
  {
   \mathcode #1 = \int_eval:n { #1 + "7000 }
  }
\ExplSyntaxOff

答案2

这可以通过改变大写字母的数学代码来实现:¹

 \mathcode`\A="7041
 \mathcode`\B="7042
 \mathcode`\Z="705A

每个字符都有一个与之相关的四位半字节数学符号。最后两个半字节给出字符代码,第一个半字节表示类别,其中7表示可以更改系列的普通符号,第二个半字节给出默认系列。罗马字母的正常设置是使用代码"7141..."715A这表示应使用系列 1(数学斜体)。

顺便说一下,是"必需的,它表示数字应解释为十六进制。否则,您将收到有关第 11 个系列未定义的神秘消息(或者,如果已定义,则会产生奇数字符),因为十六进制中的 7041 是 1B81,这将是第 11 个系列中代码 129 处的字符(可能不存在),被解释为大运算符。


  1. 顺便说一下,这在纯 TeX 和 LaTeX 中都有效。

相关内容