![siunitx パッケージを使用して、数字の 4 桁ごとに再グループ化することは可能ですか?](https://rvso.com/image/370310/siunitx%20%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E6%95%B0%E5%AD%97%E3%81%AE%204%20%E6%A1%81%E3%81%94%E3%81%A8%E3%81%AB%E5%86%8D%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%81%8B%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}
これは、空白を削除した後、入力を反転します。次に、4 桁の数字の各グループの後に区切り文字 (記号形式) が挿入され、文字列が再度反転され、先頭の区切り文字が削除されます。
を呼び出すことで区切り文字を変更できます\groupfour[<separator>]{<number>}
。
小数も扱えるように拡張されたバージョンです。小数部では、4桁の数字が細いスペースで区切られています。必要に応じて変更するのは難しくありません。
\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}