季节的礼物:允许 2 至 36 之间的任意基数的版本

季节的礼物:允许 2 至 36 之间的任意基数的版本

我想在 \hline 后面写上“+”和“x”,并且想减少数字与数字之间的空格。

由此 在此处输入图片描述

变得

在此处输入图片描述

这是我的代码

\documentclass[a4paper,12pt,oneside]{letter}
\usepackage[left=2.00cm, right=2.00cm, bottom=2.00cm, top=2.00cm]{geometry}
\begin{document}
    \begin{center}
        \begin{tabular}{cccccccc}
            &&&&6&0&0&1\\
            &&&&&2&7&2\\
            \hline$\times$
            &&&1&4&0&0&2\\
            &&5&2&0&0&7&$\cdot$\\
            &1&4&0&0&2&$\cdot$&$\cdot$\\
            \hline$+$
            &2&1&3&4&2&7&2
        \end{tabular}
    \end{center}
\end{document}

答案1

从数学角度来说我并不喜欢这个,但是......

\documentclass{article}
\usepackage{array}

\newenvironment{multiplication}[1]
 {% #1 = number of digits in the result
  \setlength{\arraycolsep}{1pt}%
  \renewcommand{\arraystretch}{0}%
  \newcommand{\size}{#1}%
  \mathcode`*=\cdot
  \begin{array}{*{#1}{>{\strut}c} c}
 }
 {\end{array}}
\newcommand{\dividerline}[1]{% #1 = symbol
  \multicolumn{\size}{c}{%
    \leaders\hrule height \dimexpr\fontdimen22\textfont2+0.2pt\relax
                   depth  -\dimexpr\fontdimen22\textfont2-0.2pt\relax
    \hfill\kern0pt
  }%
  & \smash{#1} \\
}

\begin{document}

\[
\begin{multiplication}{7}
  &   &   & 6 & 0 & 0 & 1 \\
  &   &   &   & 2 & 7 & 2 \\ \dividerline{\times}
  &   & 1 & 4 & 0 & 0 & 2 \\
  & 5 & 2 & 0 & 0 & 7 & * \\
1 & 4 & 0 & 0 & 2 & * & * \\ \dividerline{+}
2 & 1 & 3 & 4 & 2 & 7 & 2
\end{multiplication}
\]

\end{document}

在此处输入图片描述

“稍微”复杂的版本允许您避免像上述方案那样的计算错误。;-)

\documentclass{article}
\usepackage{array,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\multiplication}{O{c}mm}
 {
  \group_begin:
  % some initializations
  \setlength{\arraycolsep}{1pt}
  \renewcommand{\arraystretch}{0}
  \mathcode`*=\cdot
  % the main command
  \ensuremath { \ongky_multiply:nnn { #1 } { #2 } { #3 } }
  % end the group
  \group_end:
 }

\tl_new:N \l__ongky_multiply_first_tl
\tl_new:N \l__ongky_multiply_second_tl
\tl_new:N \l__ongky_multiply_result_tl
\tl_new:N \l__ongky_multiply_output_tl
\seq_new:N \l__ongky_multiply_summands_seq
\int_new:N \l__ongky_multiply_size_int

\cs_new_protected:Nn \ongky_multiply:nnn
 {
  \tl_set:Nx \l__ongky_multiply_first_tl { \int_eval:n { #2 } }
  \tl_set:Nx \l__ongky_multiply_second_tl { \int_eval:n { #3 } }
  \tl_set:Nx \l__ongky_multiply_result_tl { \int_eval:n { (#2)*(#3) } }
  \int_set:Nn \l__ongky_multiply_size_int { \tl_count:N \l__ongky_multiply_result_tl }
  % create the numbers to sum up (padding with * on the right)
  \int_step_inline:nn { \tl_count:N \l__ongky_multiply_second_tl }
   {
    \seq_put_right:Nx \l__ongky_multiply_summands_seq
     {
      \int_eval:n
       {
        \l__ongky_multiply_first_tl *
        \tl_item:Nn \l__ongky_multiply_second_tl { -##1 }
       }
      \prg_replicate:nn { ##1 - 1 } { * }
     }
   }
  % start building the body of the array
  \__ongky_multiply_put:V \l__ongky_multiply_first_tl
  \__ongky_multiply_put:V \l__ongky_multiply_second_tl
  \tl_put_right:Nn \l__ongky_multiply_output_tl { \__ongky_divider:n { \times } }
  \seq_map_inline:Nn \l__ongky_multiply_summands_seq
   {
    \__ongky_multiply_put:n { ##1 }
   }
  \tl_put_right:Nn \l__ongky_multiply_output_tl { \__ongky_divider:n { + } }
  \__ongky_multiply_put:V \l__ongky_multiply_result_tl
  % print the array
  \begin{array}[#1]{ *{\l__ongky_multiply_size_int}{>{\strut}c} c }
  \l__ongky_multiply_output_tl
  \end{array}
 }

\cs_new_protected:Nn \__ongky_multiply_put:n
 {
  \tl_set:Nx \l__ongky_multiply_temp_tl
   {
    \prg_replicate:nn { \l__ongky_multiply_size_int - \tl_count:n { #1 } } { {} }
    #1
   }
  \tl_map_function:NN \l__ongky_multiply_temp_tl \__ongky_multiply_put_item:n
  \tl_put_right:Nn \l__ongky_multiply_output_tl { \\ }
 }
\cs_generate_variant:Nn \__ongky_multiply_put:n { V }
\cs_new_protected:Nn \__ongky_multiply_put_item:n
 {
  \tl_put_right:Nn \l__ongky_multiply_output_tl { #1 & }
 }
\cs_new:Nn \__ongky_divider:n
 {
  \multicolumn{\l__ongky_multiply_size_int}{c}{%
    \leaders\hrule height \dimexpr\fontdimen22\textfont2+0.2pt\relax
                   depth  -\dimexpr\fontdimen22\textfont2-0.2pt\relax
    \hfill\kern0pt
  }%
  & \smash{#1} \\
 }

\ExplSyntaxOff

\begin{document}

\multiplication{6001}{272}

\bigskip

\multiplication[t]{32}{444}\qquad
\multiplication[t]{444}{32}

\end{document}

在此处输入图片描述

使用实验性功能的更高效的代码\tl_build

\documentclass{article}
\usepackage{array,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\multiplication}{O{c}mm}
 {
  \group_begin:
  % some initializations
  \setlength{\arraycolsep}{1pt}
  \renewcommand{\arraystretch}{0}
  \mathcode`*=\cdot
  % the main command
  \ensuremath { \ongky_multiply:nnn { #1 } { #2 } { #3 } }
  % end the group
  \group_end:
 }

\tl_new:N \l__ongky_multiply_first_tl
\tl_new:N \l__ongky_multiply_second_tl
\tl_new:N \l__ongky_multiply_result_tl
\tl_new:N \l__ongky_multiply_output_tl
\seq_new:N \l__ongky_multiply_summands_seq
\int_new:N \l__ongky_multiply_size_int

\cs_new_protected:Nn \ongky_multiply:nnn
 {
  \tl_set:Nx \l__ongky_multiply_first_tl { \int_eval:n { #2 } }
  \tl_set:Nx \l__ongky_multiply_second_tl { \int_eval:n { #3 } }
  \tl_set:Nx \l__ongky_multiply_result_tl { \int_eval:n { (#2)*(#3) } }
  \int_set:Nn \l__ongky_multiply_size_int { \tl_count:N \l__ongky_multiply_result_tl }
  % create the numbers to sum up (padding with * on the right)
  \int_step_inline:nn { \tl_count:N \l__ongky_multiply_second_tl }
   {
    \seq_put_right:Nx \l__ongky_multiply_summands_seq
     {
      \int_eval:n
       {
        \l__ongky_multiply_first_tl *
        \tl_item:Nn \l__ongky_multiply_second_tl { -##1 }
       }
      \prg_replicate:nn { ##1 - 1 } { * }
     }
   }
  % start building the body of the array
  \tl_build_begin:N \l__ongky_multiply_output_tl
  \__ongky_multiply_put:V \l__ongky_multiply_first_tl
  \__ongky_multiply_put:V \l__ongky_multiply_second_tl
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { \__ongky_divider:n { \times } }
  \seq_map_inline:Nn \l__ongky_multiply_summands_seq
   {
    \__ongky_multiply_put:n { ##1 }
   }
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { \__ongky_divider:n { + } }
  \__ongky_multiply_put:V \l__ongky_multiply_result_tl
  \tl_build_end:N \l__ongky_multiply_output_tl
  % print the array
  \begin{array}[#1]{ *{\l__ongky_multiply_size_int}{>{\strut}c} c }
  \l__ongky_multiply_output_tl
  \end{array}
 }

\cs_new_protected:Nn \__ongky_multiply_put:n
 {
  \tl_set:Nx \l__ongky_multiply_temp_tl
   {
    \prg_replicate:nn { \l__ongky_multiply_size_int - \tl_count:n { #1 } } { {} }
    #1
   }
  \tl_map_function:NN \l__ongky_multiply_temp_tl \__ongky_multiply_put_item:n
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { \\ }
 }
\cs_generate_variant:Nn \__ongky_multiply_put:n { V }
\cs_new_protected:Nn \__ongky_multiply_put_item:n
 {
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { #1 & }
 }
\cs_new:Nn \__ongky_divider:n
 {
  \multicolumn{\l__ongky_multiply_size_int}{c}{%
    \leaders\hrule height \dimexpr\fontdimen22\textfont2+0.2pt\relax
                   depth  -\dimexpr\fontdimen22\textfont2-0.2pt\relax
    \hfill\kern0pt
  }%
  & \smash{#1} \\
 }

\ExplSyntaxOff

\begin{document}

\multiplication{6001}{272}

\bigskip

\multiplication[t]{32}{444}\qquad
\multiplication[t]{444}{32}

\end{document}

季节的礼物:允许 2 至 36 之间的任意基数的版本

\documentclass{article}
\usepackage{array,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\multiplication}{O{c}mmO{10}}
 {
  \group_begin:
  % some initializations
  \setlength{\arraycolsep}{1pt}
  \renewcommand{\arraystretch}{0}
  \mathcode`*=\cdot
  % dirty trick for letters
  \sbox0{$\mathtt{\int_gset:Nn \g_tmpa_int {\mathgroup}}$}
  \int_step_inline:nnn { `A } { `Z }
   {
    \mathcode ##1=\int_eval:n { \g_tmpa_int * 16 * 16 + ##1 }
   }
  % the main command
  \ensuremath { \ongky_multiply:nnnn { #1 } { #2 } { #3 } { #4 } }
  % end the group
  \group_end:
 }

\tl_new:N \l__ongky_multiply_first_tl
\tl_new:N \l__ongky_multiply_second_tl
\tl_new:N \l__ongky_multiply_result_tl
\tl_new:N \l__ongky_multiply_output_tl
\seq_new:N \l__ongky_multiply_summands_seq
\int_new:N \l__ongky_multiply_size_int

\cs_new:Nn \__ongky_multiply_base:nnn
 {
  \int_to_Base:nn { \int_from_base:nn { #1 } { #3 } * \int_from_base:nn { #2 } { #3 } } { #3 }
 }
\cs_generate_variant:Nn \__ongky_multiply_base:nnn { ff }

\cs_new_protected:Nn \ongky_multiply:nnnn
 {
  \tl_set:Nx \l__ongky_multiply_first_tl { #2 }
  \tl_set:Nx \l__ongky_multiply_second_tl { #3 }
  \tl_set:Nx \l__ongky_multiply_result_tl
   {
    \__ongky_multiply_base:nnn { #2 } { #3 } { #4 }
   }
  \int_set:Nn \l__ongky_multiply_size_int { \tl_count:N \l__ongky_multiply_result_tl }
  % create the numbers to sum up (padding with * on the right)
  \int_step_inline:nn { \tl_count:N \l__ongky_multiply_second_tl }
   {
    \seq_put_right:Nx \l__ongky_multiply_summands_seq
     {
      \__ongky_multiply_base:ffn
       { \l__ongky_multiply_first_tl }
       { \tl_item:Nn \l__ongky_multiply_second_tl { -##1 } }
       { #4 }
      \prg_replicate:nn { ##1 - 1 } { * }
     }
   }
  % start building the body of the array
  \tl_build_begin:N \l__ongky_multiply_output_tl
  \__ongky_multiply_put:V \l__ongky_multiply_first_tl
  \__ongky_multiply_put:V \l__ongky_multiply_second_tl
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { \__ongky_divider:n { \times } }
  \seq_map_inline:Nn \l__ongky_multiply_summands_seq
   {
    \__ongky_multiply_put:n { ##1 }
   }
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { \__ongky_divider:n { + } }
  \__ongky_multiply_put:V \l__ongky_multiply_result_tl
  \tl_build_end:N \l__ongky_multiply_output_tl
  % print the array
  \begin{array}[#1]{ *{\l__ongky_multiply_size_int}{>{\strut}c} c }
  \l__ongky_multiply_output_tl
  \end{array}
 }

\cs_new_protected:Nn \__ongky_multiply_put:n
 {
  \tl_set:Nx \l__ongky_multiply_temp_tl
   {
    \prg_replicate:nn { \l__ongky_multiply_size_int - \tl_count:n { #1 } } { {} }
    #1
   }
  \tl_map_function:NN \l__ongky_multiply_temp_tl \__ongky_multiply_put_item:n
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { \\ }
 }
\cs_generate_variant:Nn \__ongky_multiply_put:n { V }
\cs_new_protected:Nn \__ongky_multiply_put_item:n
 {
  \tl_build_put_right:Nn \l__ongky_multiply_output_tl { #1 & }
 }
\cs_new:Nn \__ongky_divider:n
 {
  \multicolumn{\l__ongky_multiply_size_int}{c}{%
    \leaders\hrule height \dimexpr\fontdimen22\textfont2+0.2pt\relax
                   depth  -\dimexpr\fontdimen22\textfont2-0.2pt\relax
    \hfill\kern0pt
  }%
  & \smash{#1} \\
 }

\ExplSyntaxOff

\begin{document}

\multiplication{6001}{272}\qquad
\multiplication{6001}{272}[8]\qquad
\multiplication{6001}{272}[16]\qquad
\multiplication{6001}{272}[36]

\bigskip

\multiplication[t]{32}{444}\qquad
\multiplication[t]{444}{32}\qquad
\multiplication[t]{32}{444}[5]\qquad
\multiplication[t]{444}{32}[5]\qquad

\end{document}

第一行的乘法分别以 10、8、16 和 36 为基数。

第二行中前两个以十进制为基数,后两个以五进制为基数。

在此处输入图片描述

答案2

TikZ 在这里用处不大,只需简单地使用multirows 和\clines 即可。

\documentclass[a4paper,12pt,oneside]{letter}
\usepackage[left=2.00cm, right=2.00cm, bottom=2.00cm, top=2.00cm]{geometry}
\usepackage{multirow}

\begin{document}
    \begin{center}
        \setlength\tabcolsep{1pt}    
        \begin{tabular}{*{8}{c}}
            &&&6&0&0&1\\
            &&&&2&7&2&\multirow{2}{*}[-.2pt]{$\times$}\\            
            \cline{1-7}
            &&1&4&0&0&2\\
            &5&2&0&0&7&$\cdot$\\
            1&4&0&0&2&$\cdot$&$\cdot$&\multirow{2}{*}[-.2pt]{$+$}\\
            \cline{1-7}
            2&1&3&4&2&7&2
        \end{tabular}
    \end{center}
\end{document}

在此处输入图片描述

答案3

这是建议。减少距离是标准。为了放置符号,我正在加载 TiZ. 加载时间仅此而已的 Z 可能有点小题大做。

\documentclass[a4paper,12pt,oneside]{letter}
\usepackage[left=2.00cm, right=2.00cm, bottom=2.00cm, top=2.00cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{tikzmark,calc}
\begin{document}
    \begin{center}
        \begin{tabular}{*{8}{@{\,}c}}
            &&&&6&0&0&1\\
            &&&&&2&7&\tikzmarknode{2a}{2}\\
            \hline %$\times$
            &&&1&4&0&0&\tikzmarknode{2b}{2}\\
            &&5&2&0&0&7&$\cdot$\\
            &1&4&0&0&2&$\cdot$&$\tikzmarknode{dot}{\cdot}$\\
            \hline%$+$
            &2&1&3&4&2&7&\tikzmarknode{2c}{2}
        \end{tabular}
        \begin{tikzpicture}[overlay,remember picture]
         \node at ([xshift=5mm]$(2a.south)!0.6!(2b.north)$) {$\times$};
         \node at ([xshift=5mm]$(dot.south)!0.6!(2c.north)$) {$+$};
        \end{tikzpicture}
    \end{center}
\end{document}

在此处输入图片描述

答案4

要使数字紧凑,您只需添加指令\setlength\tabcolsep{0pt}。如果结果看起来太紧,也许可以尝试\setlength\tabcolsep{0.25pt}

在此处输入图片描述

\documentclass[a4paper,12pt,oneside]{letter}
\usepackage[margin=2cm]{geometry}
\begin{document}
    \begin{center}
    \setlength\tabcolsep{0pt}  % <-- new
        \begin{tabular}{cccccccc}
            &&&&6&0&0&1\\
            &&&&&2&7&2\\
            \hline$\times$
            &&&1&4&0&0&2\\
            &&5&2&0&0&7&$\cdot$\\
            &1&4&0&0&2&$\cdot$&$\cdot$\\
            \hline$+$
            &2&1&3&4&2&7&2
        \end{tabular}
    \end{center}
\end{document}

相关内容