Die aktuelle Standardoption zur Zifferngruppierung im Paket siunitx
gibt mir eine große Zahl mit Komma- oder Leerzeichen-getrennten Zahlen nach jeweils 3 Ziffern, z. B.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{siunitx}
\begin{document}
\num[group-separator={,}]{123456789}
\end{document}
würde mir 123.456.789 geben. Ist es möglich, es so zu ändern, dass ich 1.2345.6789 bekomme?
Weder in der Dokumentation noch anderswo im Internet kann ich eine Antwort darauf finden siunitx
. Ich würde mich auch freuen, wenn es ein alternatives Paket gibt, das Zahlenformatierung und -satz genauso automatisch übernimmt wie siunitx
, aber diese Umgruppierung zulässt. Vielen Dank im Voraus!
Antwort1
Derzeit gibt es hierfür keine Unterstützung in siunitx
. Sie können dies mit anderem Code tun:
\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}
Dadurch wird die Eingabe umgekehrt, nachdem Leerzeichen entfernt wurden. Anschließend wird nach jeder Gruppe von vier Ziffern das Trennzeichen (in symbolischer Form) eingefügt. Die Zeichenfolge wird erneut umgekehrt und ein führendes Trennzeichen wird entfernt.
Durch einen Aufruf können Sie das Trennzeichen ändern \groupfour[<separator>]{<number>}
.
Eine erweiterte Version für den Umgang mit Dezimalzahlen. Im Dezimalteil werden Gruppen von vier Ziffern durch schmale Leerzeichen getrennt. Es wäre nicht schwierig, dies je nach Bedarf zu ändern.
\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}
Antwort2
Der Abwechslung halber hier eine LuaLaTeX-basierte Lösung. Sie ist sehr ähnlich zu der indiese Antwort. Die Lösung definiert ein Benutzermakro namens \groupfour
, das eine Lua-Funktion aufruft, die die eigentliche Arbeit erledigt. Wenn die Zahl (das Argument von \groupfour
) einen Dezimalteil enthält, werden im Dezimalteil keine Kommas eingefügt.
% !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}