我正在尝试显示二进制数的垂直加法,但 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}