我希望能够在siunitx
包中保留前导零。这是使用\num{012345}
产品,12 345
但我希望有012 345
。
参考:
- Siunitx 表前导零建议关闭数字解析(
parse-numbers=false
),但三位数字组之间的间距也会被禁用。 - 使用 siunitx 为方位角指定前导零建议使用
minimum-integer-digits = <n>
,但这需要知道有多少位数字。
代码:
\documentclass{article}
\usepackage{siunitx}
\begin{document}
Default Output: $012345 = \num{012345}$
Desired Output: $012345 = 012\,345$
\end{document}
答案1
(修改了答案以允许设置包group-minimum-digits
的参数的等效项siunitx
。
这是一个基于 LuaLaTeX 的解决方案。它定义了一个名为 的用户级 LaTeX 宏\Lnum
,它充当名为 的 Lua 函数的前端group_string
。这个 Lua 函数几乎完成了所有工作。
group-minimum-digits
包的参数的等价物siunitx
——通常是5
或者4
——可以在宏的可选参数中设置\Lnum
。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode}
%% Lua-side code: define a Lua function called 'group_string'
\begin{luacode}
function group_string ( s , n )
-- s: Input string -- usually, an integer.
-- n: Minimum number of digits before grouping
-- is performed. This should be either 4 or 5.
-- If s contains n or fewer characters, do nothing,
-- i.e., return the string s without modifications.
-- Otherwise, insert thinspace into input string at
-- every third character, starting from the right.
-- Note: Leading zeros are preserved automatically.
if string.len ( s ) < n then
return s -- don't modify input string
else
t = "" -- initialize output string
while string.len ( s ) > 3 do
t = "\\," .. string.sub ( s, -3 ) .. t
s = string.sub ( s , 1, -4 ) -- drop last 3 chars
end
return s .. t
end
end
\end{luacode}
%% LaTeX-side code: A user macro called "\Lnum".
%% Default value of optional argument of \Lnum
%% should be either 4 or 5.
\newcommand\Lnum[2][4]{\directlua{%
tex.sprint ( group_string ( "#2" , #1 ) )}}
\begin{document}
\begin{tabular}{rr}
input & output \\[1ex]
12345 & \Lnum{12345} \\
012345 & \Lnum{012345} \\
0000000 & \Lnum{0000000} \\
0123 & \Lnum{0123} \\
0123 & \Lnum[5]{0123} \\ % set equivalent of 'group-minimum-digits' to 5
\end{tabular}
\end{document}