ACM TAPS 兼容 siunitx 替代千位分隔符

ACM TAPS 兼容 siunitx 替代千位分隔符

我想将像 31556952000 这样的大数字格式化为 31,556,952,000,并使用千位分隔符。\usepackage[group-separator={,}]{siunitx}在序言和\num{31556952000}正文中添加效果很好,但不适合 ACM TAPS 提交,因为siunitx没有已批准的包裹清单。 作为使用 siunitx 保留千位分隔符,这是强加的要求。

如何仅使用 ACM TAPS 支持的包来获取以逗号分隔的千位?

答案1

取出核心循环siunitx并写出,我们会得到类似

\documentclass{article}
\makeatletter
\providecommand*\num[2][]{%
  \ensuremath{%
    \num@auxi{0}{}#2\num@q@stop
  }%
}
\newcommand\num@auxi{}
\long\def\num@auxi#1#2#3{%
  \ifx#3\num@q@stop
    \expandafter\num@auxiii
  \else
    \expandafter\num@auxii
  \fi
    {#1}{#2}{#3}%
}
\newcommand\num@auxiii[3]{%
  \expandafter\num@auxiv\expandafter
    {\number\numexpr#1\relax}{#2}%
}
\newcommand\num@auxii[3]{\num@auxi{#1 + 1}{#2#3}}
\newcommand\num@auxiv[2]{%
  \@nameuse{num@aux@\number\numexpr#1-(\@num@div#1;3;)*3\relax}{#2}%
}
\long\@namedef{num@aux@0}#1{%
  \num@loop@first#1\num@q@stop
}
\long\@namedef{num@aux@1}#1{%
  \num@loop@first{}{}#1\num@q@stop
}
\long\@namedef{num@aux@2}#1{%
  \num@loop@first{}#1\num@q@stop
}
\newcommand\num@loop@first[4]{%
  #1#2#3%
  \ifx#4\num@q@stop
    \expandafter\@gobble
  \else
    \expandafter\num@loop
  \fi
    #4%
}
\newcommand\num@loop[4]{%
  \mathord{,}%
  #1#2#3%
  \ifx#4\num@q@stop
    \expandafter\@gobble
  \else
    \expandafter\num@loop
  \fi
    #4%
}
\newcommand\@num@div{}
\long\def\@num@div#1#2;#3#4;{%
 \ifx0#1%
   0%
 \else
   (#1#2\ifx-#1+\else-\fi(\ifx-#3-\fi#3#4-1)/2)%
 \fi /#3#4%
}
\def\nume@q@stop{\nume@q@stop}
\makeatother
\begin{document}

\num{31556952000}

\end{document}

相关内容