数学中的直线和老式数字

数学中的直线和老式数字

我的问题如下:我想像一些旧数学书一样,在数学公式中使用旧式数字作为系数(例如在 display- 和 textstyle 中),但在索引和指数中使用内衬数字(例如在 script- 和 scriptscriptstyle 中)。不过,我不确定这是否完全等同。我猜这个\mathchoice命令的使用会很有用,但我真的不知道如何使用它。

有人知道如何自动实现这一点吗?

添加:我忘了说解决方案应该适用于任何数学字体。所提出的解决方案与默认的 TeX 数学字体配合得很好,但与 MinionPro 却不兼容。也许是 MinionPro 的一个特定问题?

答案1

我不会这么做。旧书并不总是好的排版范例。

\documentclass{article}

\makeatletter
\def\changedigit#1{%
  \begingroup\lccode`~=`#1\lowercase{\endgroup
    \edef~}{{\mathchoice
      {\noexpand\mathnormal{\mathchar\the\mathcode`#1}}
      {\noexpand\mathnormal{\mathchar\the\mathcode`#1}}
      {\mathchar\the\mathcode`#1}
      {\mathchar\the\mathcode`#1}
    }}
  \AtBeginDocument{\mathcode`#1=\string"8000 }
}
\@for\next:=1,2,3,4,5,6,7,8,9,0\do{\expandafter\changedigit\next}
\let\changedigit\@undefined
\makeatother

\begin{document}

$1234567890^{1234567890}$

$10x_0 + 11y_1$

\end{document}

在此处输入图片描述

您可能希望将\scriptscriptstyle第三个参数添加到\mathchoice,这将给出

在此处输入图片描述

或玩\DeclareMathSizes(见https://tex.stackexchange.com/a/58144/4427

如果你想让所有数字始终保持旧样式,请将\makeatletter\makeatother之间的代码更改为

\makeatletter
\@for\next:=1,2,3,4,5,6,7,8,9,0\do{%
  \begingroup\edef\x{%
    \mathcode`\next=\noexpand\number\numexpr\mathcode`\next-"7000+"100\relax}%
    \edef\x{\endgroup\x}\x
}
\makeatother

在此处输入图片描述

当然,最后这段代码可以替换为

\DeclareMathSymbol{0}{\mathord}{letters}{`0}

其它数字也类似。

相关内容