我想格式化二进制或十六进制数,并在每 2 位或 4 位数字(或任何其他值,如 8 位或更多)处使用空格分隔符。
一张小图片胜过长篇解释,以下是我想要做的:
正如您在本 mwe 中看到的,我使用了带有 padzeroes 的 fmtcount 包:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fmtcount}
\begin{document}
Binary value : {\padzeroes[16]\binarynum{129}}$_{(2)}$ %
should display 0000 0000 1000 0001$_{(2)}$
Hexadecimal value: {\padzeroes[8]\Hexadecimalnum{65000}}$_{(16)}$ %
should display 00 00 FD E8$_{(2)}$
\end{document}
我想要做的是显示给定十进制数的各种基数(2、3、7、8、10、16)的数字,并使用空格和前导 0 正确格式化这些数字(无需自己执行转换)。
我已经找到了一些有类似问题的帖子,但没有一个能实现这一点(它们像 numprint 包一样,每 3 位数字显示一个带千位分隔符的数字;或者它们没有自动显示)。这些帖子如下:
编辑另外两个相关问题:
我也更喜欢使用 pdflatex。
答案1
一种可选地对十进制形式的输入进行转换的解决方案;我可以想到其他改进。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\printnumber}{O{}m}
{
\group_begin:
\keys_set:nn { lauhub/printnumber } { #1 }
\lauhub_print_number:n { #2 }
\group_end:
}
\tl_new:N \l_lauhub_number_tl
\tl_new:N \l_lauhub_output_tl
\int_new:N \l__lauhub_temp_int
\keys_define:nn { lauhub/printnumber }
{
padding .int_set:N = \l_lauhub_length_int,
padding .initial:n = 0,
radix .int_set:N = \l_lauhub_radix_int,
radix .initial:n = 10,
grouping .int_set:N = \l_lauhub_grouping_int,
grouping .initial:n = 3,
convert .bool_set:N = \l_lauhub_convert_bool,
convert .default:n = true,
convert .initial:n = false,
}
\cs_new_protected:Npn \lauhub_print_number:n #1
{
\tl_clear:N \l_lauhub_output_tl
\bool_if:NTF \l_lauhub_convert_bool
{
\tl_set:Nx \l_lauhub_number_tl { \int_to_Base:nn { #1 } { \l_lauhub_radix_int } }
}
{
\tl_set:Nn \l_lauhub_number_tl { #1 }
}
\prg_replicate:nn { \l_lauhub_length_int - \tl_count:N \l_lauhub_number_tl }
{
\tl_put_left:Nn \l_lauhub_number_tl { 0 }
}
\int_zero:N \l__lauhub_temp_int
\tl_map_inline:Nn \l_lauhub_number_tl
{
\tl_put_right:Nn \l_lauhub_output_tl { ##1 }
\int_incr:N \l__lauhub_temp_int
\bool_if:nT
{
\int_compare_p:n
{
\int_mod:nn { \l__lauhub_temp_int } { \l_lauhub_grouping_int } == 0
}
&&
\int_compare_p:n
{
\l__lauhub_temp_int < \l_lauhub_length_int
}
}
{
\tl_put_right:Nn \l_lauhub_output_tl { \, }
}
}
\ensuremath
{
\mathrm{ \tl_use:N \l_lauhub_output_tl } \sb { ( \int_to_arabic:n { \l_lauhub_radix_int } ) }
}
}
\ExplSyntaxOff
\begin{document}
\printnumber[padding=16,grouping=4,radix=2]{10000001}
\printnumber[padding=16,grouping=4,radix=2,convert]{129}
\printnumber[padding=8,grouping=2,radix=16]{FDE8}
\printnumber[padding=8,grouping=2,radix=16,convert]{65000}
\end{document}
设置选项后,输入(可能转换为请求的基数)左侧用零填充。然后映射标记列表:当步数是值的倍数时,在grouping
较窄的空间中添加(最后一步除外)。
答案2
它要求将输出设置为固定宽度字体(有些人认为这是更好的选择)。我通过\padzeroes
使用连续修剪 的输出来实现这一点\chop{number}{string}
。
\documentclass{article}
%\usepackage[utf8]{inputenc}
%\usepackage[T1]{fontenc}
\usepackage{fmtcount}
\usepackage{trimclip,ifthen}
\newsavebox\numberbox
\newlength\boxoffset
\newcommand\chop[2]{%
\bgroup\ttfamily%
\setbox0=\hbox{0}%
\savebox\numberbox{#2}%
\boxoffset=0pt%
\whiledo{\lengthtest{\boxoffset<\wd\numberbox}}{%
\clipbox{\boxoffset+0pt 0pt \wd\numberbox-\boxoffset-#1\wd0 -1pt}{\usebox{\numberbox}}%
\addtolength{\boxoffset}{#1\wd0}%
\ifdim\boxoffset<\wd\numberbox\ \fi%
}\unskip\egroup%
}
\begin{document}
Binary value : {\chop{4}{\padzeroes[16]\binarynum{129}}}$_{(2)}$ %
Hexadecimal value: {\chop{2}{\padzeroes[8]\Hexadecimalnum{65000}}}$_{(16)}$ %
\end{document}