![siunitx 패키지를 사용하여 숫자의 4자리마다 다시 그룹화할 수 있습니까?](https://rvso.com/image/370310/siunitx%20%ED%8C%A8%ED%82%A4%EC%A7%80%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%88%AB%EC%9E%90%EC%9D%98%204%EC%9E%90%EB%A6%AC%EB%A7%88%EB%8B%A4%20%EB%8B%A4%EC%8B%9C%20%EA%B7%B8%EB%A3%B9%ED%99%94%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
패키지의 현재 기본 숫자 그룹화 옵션은 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}