我的问题如下:我想像一些旧数学书一样,在数学公式中使用旧式数字作为系数(例如在 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}
其它数字也类似。