如何使用 xlop 包编写自己的结果

如何使用 xlop 包编写自己的结果

我正在尝试显示二进制数的垂直加法,但 xlop 会自动解决所有问题,假设基数为 10,然后显示它。有没有办法让我删除结果并用我自己的结果替换它?我说的不是占位符,而是我自己的手动解决方案。例如 xlop 会这样做:

  1010
+ 1001
  ____
  2011

但我想删除解决方案(2011)并将其替换为:

  1010
+ 1001
  ____
 10011

那么你将如何通过这种方式来展示携带呢?

答案1

xlop不支持二进制运算。你可以定义自己的版本:

\documentclass{article}
\usepackage{booktabs}

\ExplSyntaxOn

\NewDocumentCommand{\binaryaddition}{mm}
 {
  \kartashuvit_binadd:nn { #1 } { #2 }
 }

\tl_new:N \l__kartashuvit_binadd_a_tl
\tl_new:N \l__kartashuvit_binadd_b_tl
\tl_new:N \l__kartashuvit_binadd_c_tl

\cs_new_protected:Nn \kartashuvit_binadd:nn
 {
  \tl_set:Nx \l__kartashuvit_binadd_c_tl
   {
    \int_to_bin:n { \int_from_bin:n { #1 } + \int_from_bin:n { #2 } }
   }
  % pad the summands with \scan_stop:
  \tl_set:Nx \l__kartashuvit_binadd_a_tl
   {
    \prg_replicate:nn
     { \tl_count:N \l__kartashuvit_binadd_c_tl - \tl_count:n { #1 } }
     { \scan_stop: }
    #1
   }
  \tl_set:Nx \l__kartashuvit_binadd_b_tl
   {
    \prg_replicate:nn
     { \tl_count:N \l__kartashuvit_binadd_c_tl - \tl_count:n { #2 } }
     { \scan_stop: }
    #2
   }
  \group_begin:
  \setlength{\tabcolsep}{3pt}
  \begin{tabular}{@{} c *{ \tl_count:N \l__kartashuvit_binadd_c_tl } { c } }
  \tl_map_function:NN \l__kartashuvit_binadd_a_tl \__kartashuvit_binadd_tab:n \\
  +
  \tl_map_function:NN \l__kartashuvit_binadd_b_tl \__kartashuvit_binadd_tab:n \\
  \midrule
  \tl_map_function:NN \l__kartashuvit_binadd_c_tl \__kartashuvit_binadd_tab:n \\
  \end{tabular}
  \group_end:
 }

\cs_new:Nn \__kartashuvit_binadd_tab:n { & #1 }

\ExplSyntaxOff

\begin{document}

\binaryaddition{1010}{1001}
\quad
\binaryaddition{1010}{101}
\quad
\binaryaddition{110}{1001}
\end{document}

您甚至不需要亲自计算总和!

在此处输入图片描述

思路是将三个变量设置为加数和和;然后计算和的位数,并用 填充加数,\relax使单元格数正确。最后,我们可以&在每个数字前面添加 来构建表格。

附录

\binaryaddition这里是带有 * 变体的修改版本,用于显示进位。

\documentclass{article}
\usepackage{booktabs}

\ExplSyntaxOn

\NewDocumentCommand{\binaryaddition}{smm}
 {
  \IfBooleanTF{#1}
   { \bool_set_true:N \l__kartashuvit_binadd_carries_bool }
   { \bool_set_false:N \l__kartashuvit_binadd_carries_bool }
  \kartashuvit_binadd:nn { #2 } { #3 }
 }

\bool_new:N \l__kartashuvit_binadd_carries_bool
\tl_new:N \l__kartashuvit_binadd_a_tl
\tl_new:N \l__kartashuvit_binadd_b_tl
\tl_new:N \l__kartashuvit_binadd_c_tl
\tl_new:N \l__kartashuvit_binadd_carries_tl

\cs_new_protected:Nn \kartashuvit_binadd:nn
 {
  \tl_set:Nx \l__kartashuvit_binadd_c_tl
   {
    \int_to_bin:n { \int_from_bin:n { #1 } + \int_from_bin:n { #2 } }
   }
  % pad the summands with \c_empty_tl
  \tl_set:Nx \l__kartashuvit_binadd_a_tl
   {
    \prg_replicate:nn
     { \tl_count:N \l__kartashuvit_binadd_c_tl - \tl_count:n { #1 } }
     { \exp_not:N \c_empty_tl }
    #1
   }
  \tl_set:Nx \l__kartashuvit_binadd_b_tl
   {
    \prg_replicate:nn
     { \tl_count:N \l__kartashuvit_binadd_c_tl - \tl_count:n { #2 } }
     { \exp_not:N \c_empty_tl }
    #2
   }
  \bool_if:NT \l__kartashuvit_binadd_carries_bool
   {
    \__kartashuvit_binadd_carries:
   }
  \group_begin:
  \setlength{\tabcolsep}{3pt}
  \begin{tabular}{@{} c *{ \tl_count:N \l__kartashuvit_binadd_c_tl } { c } }
  \bool_if:NT \l__kartashuvit_binadd_carries_bool
   {
    \tl_map_function:NN \l__kartashuvit_binadd_carries_tl \__kartashuvit_binadd_tab_small:n \\
   }
  \tl_map_function:NN \l__kartashuvit_binadd_a_tl \__kartashuvit_binadd_tab:n \\
  +
  \tl_map_function:NN \l__kartashuvit_binadd_b_tl \__kartashuvit_binadd_tab:n \\
  \midrule
  \tl_map_function:NN \l__kartashuvit_binadd_c_tl \__kartashuvit_binadd_tab:n \\
  \end{tabular}
  \group_end:
 }

\cs_new:Nn \__kartashuvit_binadd_tab:n { & #1 }
\cs_new:Nn \__kartashuvit_binadd_tab_small:n { & \scriptsize #1 }

\cs_new_protected:Nn \__kartashuvit_binadd_carries:
 {
  \tl_set:Nn \l__kartashuvit_binadd_carries_tl { \c_empty_tl }
  \int_step_inline:nn { \tl_count:N \l__kartashuvit_binadd_c_tl - 1 }
   {
    \int_compare:nNnTF
     {
      0\tl_item:Nn \l__kartashuvit_binadd_a_tl { -##1 }
      +
      0\tl_item:Nn \l__kartashuvit_binadd_b_tl { -##1 }
      +
      0\tl_item:Nn \l__kartashuvit_binadd_carries_tl { -##1 }
     }
     >
     { 1 }
     {% there's a carry
      \tl_put_left:Nn \l__kartashuvit_binadd_carries_tl { 1 }
     }
     {% no carry
      \tl_put_left:Nn \l__kartashuvit_binadd_carries_tl { \c_empty_tl }
     }
   }
 }

\ExplSyntaxOff

\begin{document}

\subsection*{Don't show carries}

\binaryaddition{1010}{1001}
\quad
\binaryaddition{1011}{111}
\quad
\binaryaddition{110}{1001}

\subsection*{Show carries}

\binaryaddition*{1010}{1001}
\quad
\binaryaddition*{1011}{111}
\quad
\binaryaddition*{110}{1001}

\end{document}

在此处输入图片描述

相关内容