是否可以使用 siunitx 包对数字中的每 4 位数字进行重新分组?

是否可以使用 siunitx 包对数字中的每 4 位数字进行重新分组?

包中当前的默认数字分组选项siunitx为我提供了每 3 位数字用逗号分隔或空格分隔的大量数字,例如

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage{siunitx}

\begin{document}

   \num[group-separator={,}]{123456789}

\end{document}

将得到 123,456,789。是否可以将其更改为 1,2345,6789?

siunitx我在文档或互联网上的其他地方找不到答案。我也很高兴知道是否有替代包可以像 一样自动处理数字格式和排版siunitx,但允许这种重新分组。提前致谢!

答案1

目前不支持此功能siunitx。您可以使用一些不同的代码来实现:

\documentclass{article}
\usepackage{xparse,siunitx}

\ExplSyntaxOn

\NewDocumentCommand{\groupfour}{O{,}m}
 {
  \mikew_groupfour:nn { #1 } { #2 }
 }

\tl_new:N \l_mikew_groupfour_separator_tl
\tl_new:N \l_mikew_groupfour_number_tl

\cs_new_protected:Nn \mikew_groupfour:nn
 {
  \tl_set:Nn \l_mikew_groupfour_separator_tl { {#1} }
  \tl_set:Nx \l_mikew_groupfour_number_tl { #2 }
  \tl_replace_all:Nnn \l_mikew_groupfour_number_tl { ~ } { }
  \tl_reverse:N \l_mikew_groupfour_number_tl
  \regex_replace_all:nnN
   { [0-9]{4} } % search
   { \0 \c{l_mikew_groupfour_separator_tl} } % replace
   \l_mikew_groupfour_number_tl % token list
  \tl_reverse:N \l_mikew_groupfour_number_tl
  \regex_replace_once:nnN
   { \A \c{l_mikew_groupfour_separator_tl} }
   { }
   \l_mikew_groupfour_number_tl
  \tl_use:N  \l_mikew_groupfour_number_tl
 }

\ExplSyntaxOff

\begin{document}

\groupfour{ 123456789 }

\groupfour[\,]{1 2345 6789}

$\groupfour{12345678}$ % test for math mode

\end{document}

这将在删除空格后反转输入;然后在每组四位数字之后插入分隔符(以符号形式);再次反转字符串并删除前导分隔符。

您可以通过调用来更改分隔符\groupfour[<separator>]{<number>}

在此处输入图片描述

扩展版本,也用于处理十进制数。在小数部分,四位数字的组由细空格隔开。根据需要更改它并不困难。

\documentclass{article}
\usepackage{xparse,siunitx}

\ExplSyntaxOn

\NewDocumentCommand{\groupfour}{O{,}m}
 {
  \mikew_groupfour:nn { #1 } { #2 }
 }

\tl_new:N \l_mikew_groupfour_separator_tl
\tl_new:N \l_mikew_groupfour_number_tl
\seq_new:N \l_mikew_groupfour_parts_seq

\cs_new_protected:Nn \mikew_groupfour:nn
 {
  \tl_set:Nn \l_mikew_groupfour_separator_tl { {#1} }
  \regex_split:nnN { \. } { #2 } \l_mikew_groupfour_parts_seq
  \tl_set:Nx 
   \l_mikew_groupfour_number_tl
   { \seq_item:Nn \l_mikew_groupfour_parts_seq { 1 } }
  \tl_replace_all:Nnn \l_mikew_groupfour_number_tl { ~ } { }
  \tl_reverse:N \l_mikew_groupfour_number_tl
  \__mikew_groupfour_replace:
  \tl_reverse:N \l_mikew_groupfour_number_tl
  \tl_use:N  \l_mikew_groupfour_number_tl
  \int_compare:nT { \seq_count:N \l_mikew_groupfour_parts_seq > 1 }
   {
    \tl_set:Nn \l_mikew_groupfour_separator_tl { {\,} }
    . % print the decimal point
    \tl_set:Nx 
     \l_mikew_groupfour_number_tl
     { \seq_item:Nn \l_mikew_groupfour_parts_seq { 2 } }
    \__mikew_groupfour_replace:
    \tl_use:N  \l_mikew_groupfour_number_tl
   }
 }

\cs_new_protected:Nn \__mikew_groupfour_replace:
 {
  \regex_replace_all:nnN
   { [0-9]{4} } % search
   { \0 \c{l_mikew_groupfour_separator_tl} } % replace
   \l_mikew_groupfour_number_tl % token list
  \regex_replace_once:nnN
   { \c{l_mikew_groupfour_separator_tl} \Z }
   { }
   \l_mikew_groupfour_number_tl
 }

\ExplSyntaxOff

\begin{document}

X\groupfour{ 123456789 }X

X\groupfour[\,]{1 2345 6789}X

X$\groupfour{12345678}$X

X\groupfour{1234567890.12345678}X

\end{document}

在此处输入图片描述

答案2

为了多样化,这里有一个基于 LuaLaTeX 的解决方案。它与这个答案。解决方案定义了一个名为 的用户宏\groupfour,它调用执行实际工作的 Lua 函数。如果数字( 的参数\groupfour)包含小数部分,则小数部分不会插入逗号。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{siunitx}
\usepackage{luacode}
\begin{luacode}
function groupfour ( s )
    z = ""
    -- Check if number contains a decimal part. If so, don't
    -- insert commas in the decimal part.
    n = string.find ( s, "%." ) 
    if n then
       -- Set aside decimal part of number in string "z"
       z = string.sub ( s , n )
       s = string.sub ( s , 1 , n-1 )
    end 
    t = ""
    while string.len ( s ) > 4 do
        t = "{,}" .. string.sub ( s, -4 ) .. t
        s = string.sub ( s , 1, -5 ) 
    end
    tex.sprint ( s .. t .. z )
end
\end{luacode}
\newcommand\groupfour[1]{\directlua{groupfour(\luastring{#1})}}

\begin{document}
\num[group-separator={,}]{123456789}

\groupfour{123456789}
\end{document}

相关内容