如何在二进制或十六进制数的每个 X 位数字处添加空格?

如何在二进制或十六进制数的每个 X 位数字处添加空格?

我想格式化二进制或十六进制数,并在每 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}

在此处输入图片描述

相关内容