我想排版大数字,并在百位和千位之间使用分隔符(例如空格或“,”)等...例如 1 百万 = 1 000 000。
我知道有包siunitx
可以很好地完成这项工作,但必须写\num{the big number}
。 是否有可能,这种排版会自动出现在数学环境中的任何数字上$ ...$
,而无需明确编写\num
?
答案1
你真的 真的 真的 不想这样做。
但如果你确实想这么做,那么你可以这么做,但你知道这必然会破坏一些东西。
\documentclass{article}
\usepackage{comma}
\def\commaformtoken{\,}
\edef\mca{\the\mathcode`0\space}
\edef\mcb{\the\mathcode`1\space}
\edef\mcc{\the\mathcode`2\space}
\edef\mcd{\the\mathcode`3\space}
\edef\mce{\the\mathcode`4\space}
\edef\mcf{\the\mathcode`5\space}
\edef\mcg{\the\mathcode`6\space}
\edef\mch{\the\mathcode`7\space}
\edef\mci{\the\mathcode`8\space}
\edef\mcj{\the\mathcode`9\space}
\def\normaldigits{%
\mathcode`\0=\mca
\mathcode`\1=\mcb
\mathcode`\2=\mcc
\mathcode`\3=\mcd
\mathcode`\4=\mce
\mathcode`\5=\mcf
\mathcode`\6=\mcg
\mathcode`\7=\mch
\mathcode`\8=\mci
\mathcode`\9=\mcj
}
\newcount\hmmcnt
\makeatletter
\def\hmmdef#1{%
\bgroup\lccode`\~`#1\lowercase{\egroup
\count@\mathcode`~
\mathcode`~="8000
\edef~{%
\bgroup
\noexpand\normaldigits
\afterassignment\noexpand\hummcomma\hmmcnt#1}}}
\def\hummcomma{\@commaform\hmmcnt\egroup}
\def\activedigits{
\hmmdef0
\hmmdef1
\hmmdef2
\hmmdef3
\hmmdef4
\hmmdef5
\hmmdef6
\hmmdef7
\hmmdef8
\hmmdef9
}
\makeatother
\begin{document}
\activedigits
\[123456 = \frac{1234560}{10} \]
\normaldigits
\[123456 = \frac{1234560}{10} \]
\activedigits
\[123456 = \frac{1234560}{10} \]
\end{document}
siunitx 更新:
如果你宁愿使用siunitx
而不是comma
包来进行间距处理,那么可以改变包的加载方式,并改变
\def\hummcomma{\@commaform\hmmcnt\egroup}
到
\def\hummcomma{\num{\the\hmmcnt}\egroup}
代码基本思想
将 123 变成 \num{123} 这个想法相当简单。
给每个数字一个活动定义,这样,
1
相当于\aftarassignment\helper\count@1
然后,TeX 开始分配一个数字,
\count@
因此它会吞噬所有后续数字,直到得到一个非数字并保留该值\count@
(如果该数字太大则会失败)。原始
\afterassignment
然后重新插入\helper
要扩展的令牌,因此现在可以从计数寄存器访问数字,\the\count@
因此\expandafter\num\expandafter{\the\count@}
与\num{123}
上面的描述有个小问题,因为您不知道哪个数字会排在第一位,所以您必须让所有数字都有数学代码"8000
并都有活动定义。但是当通过执行重新插入数字时,它们仍然会有那些定义,\the\count@
这会让您陷入无限循环。所以定义必须启动一个本地组,在该组内重新定义每个数字以排版其正常\mathcode
指定的字符,然后最后在应用间距命令后结束该组。这些\mc?
命令是每个数字的保存的数学代码,并\hmmdef
设置其参数中指定的数字以具有正确的数学代码和活动定义。\hmmcomma
是插入的辅助标记,它实际上使用或包\aftergroup
对每三个数字进行间距处理。siunitx
comma
更新改变了分组的使用\bgroup
,而不是\begingroup
因为后者不工作,所以x^2
您必须使用官方的 LaTeX 语法x^{2}
。
答案2
不,在 LaTeX 中无法自动完成此操作。包括 Knuth 在内的许多人都不同意您在数学环境中使用千位分隔符。(请参阅在等式中应该使用千位分隔符吗?)。
编辑
正如大卫刚刚展示的那样,实现自动化是可能的。