![是否可以使用 siunitx 套件將數字中的每 4 位數字重新分組?](https://rvso.com/image/370310/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20siunitx%20%E5%A5%97%E4%BB%B6%E5%B0%87%E6%95%B8%E5%AD%97%E4%B8%AD%E7%9A%84%E6%AF%8F%204%20%E4%BD%8D%E6%95%B8%E5%AD%97%E9%87%8D%E6%96%B0%E5%88%86%E7%B5%84%EF%BC%9F.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}