自动千位分隔符?

自动千位分隔符?

我想排版大数字,并在百位和千位之间使用分隔符(例如空格或“,”)等...例如 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. 给每个数字一个活动定义,这样,1相当于\aftarassignment\helper\count@1

  2. 然后,TeX 开始分配一个数字,\count@因此它会吞噬所有后续数字,直到得到一个非数字并保留该值\count@(如果该数字太大则会失败)。

  3. 原始\afterassignment然后重新插入\helper要扩展的令牌,因此现在可以从计数寄存器访问数字,\the\count@因此\expandafter\num\expandafter{\the\count@}\num{123}

上面的描述有个小问题,因为您不知道哪个数字会排在第一位,所以您必须让所有数字都有数学代码"8000并都有活动定义。但是当通过执行重新插入数字时,它们仍然会有那些定义,\the\count@这会让您陷入无限循环。所以定义必须启动一个本地组,在该组内重新定义每个数字以排版其正常\mathcode指定的字符,然后最后在应用间距命令后结束该组。这些\mc?命令是每个数字的保存的数学代码,并\hmmdef设置其参数中指定的数字以具有正确的数学代码和活动定义。\hmmcomma是插入的辅助标记,它实际上使用或包\aftergroup对每三个数字进行间距处理。siunitxcomma

更新改变了分组的使用\bgroup,而不是\begingroup因为后者不工作,所以x^2您必须使用官方的 LaTeX 语法x^{2}

答案2

不,在 LaTeX 中无法自动完成此操作。包括 Knuth 在内的许多人都不同意您在数学环境中使用千位分隔符。(请参阅在等式中应该使用千位分隔符吗?)。

编辑

正如大卫刚刚展示的那样,实现自动化是可能的。

相关内容