siunitx 패키지를 사용하여 숫자의 4자리마다 다시 그룹화할 수 있습니까?

siunitx 패키지를 사용하여 숫자의 4자리마다 다시 그룹화할 수 있습니까?

패키지의 현재 기본 숫자 그룹화 옵션은 siunitx3자리마다 쉼표로 구분되거나 공백으로 구분된 큰 숫자를 제공합니다. 예:

\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}

관련 정보