4

I edited a function about vertical mltiplication to achieve horizontal placement of the two multipliers.

Multiplication with and without the sign + which I need

I need the sign + centered between 6942 and 4628 in black color.I tried with \begin{align} but the functions for the \multiplication doesn't work .

  \documentclass{article}
\usepackage{fp,intcalc}
\begin{document}
    \def\multiplication#1#2{
        \def\answer{\FPmul\temp{#1}{#2}
            \parindent=0pt
            \FPround\temp{\temp}{0}\temp}
        \def\lineFirst{#1.#2}
        \def\linez##1##2##3{
            \intcalcMul{#1}{##2}##3}
        \def\Rule{\rule{1.3cm}{0.3pt}}
        \begin{minipage}[t]{1.5cm}
            \begin{flushright}
                \lineFirst \vspace{-3mm}
                \Rule \\
                \def\Z{\phantom{0}}
                \linez{#1}{2}\\
                \linez{#1}{1}{\Z}\\[-8pt]
                \Rule
                \answer
            \end{flushright}
    \end{minipage}}
    \multiplication{2314}{12}
    $\; \;$ 
    \multiplication{2314}{12}

\end{document}  

https://imgur.com/a/Pe80kHb

Simeon Simeonov
  • 819
  • 5
  • 11

1 Answers1

4

I'd use expl3 for the job. Do you really use a period for denoting multiplication?

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

\ExplSyntaxOn
\NewDocumentCommand{\multiplication}{sO{c}mm}
 {
  \IfBooleanTF { #1 }
   {
    \ensuremath{ #3.#4=\int_eval:n { #3 * #4 } }
   }
   {
    \simeon_multiplication:nnn { #2 } { #3 } { #4 }
   }
 }

\seq_new:N \l__simeon_multiplication_b_seq
\seq_new:N \l__simeon_multiplication_c_seq
\int_new:N \l__simeon_multiplication_step_int

\cs_new_protected:Nn \simeon_multiplication:nnn
 {
  % store the second factor in reverse order
  \seq_set_split:Nnn \l__simeon_multiplication_b_seq { } { #3 }
  \seq_reverse:N \l__simeon_multiplication_b_seq
  % store the partial products with a padding
  \seq_clear:N \l__simeon_multiplication_c_seq
  \int_zero:N \l__simeon_multiplication_step_int
  \seq_map_inline:Nn \l__simeon_multiplication_b_seq
   {
    \seq_put_right:Nx \l__simeon_multiplication_c_seq
     {
      &\int_eval:n { #2 * ##1 }
      \prg_replicate:nn { \l__simeon_multiplication_step_int } { \__simeon_zero: }
     }
    \int_incr:N \l__simeon_multiplication_step_int
   }
  \begin{tabular}[#1]{@{}r@{}r@{}}
  \multicolumn{2}{@{}r@{}}{#2.#3} \\
  \midrule
  \seq_use:Nn \l__simeon_multiplication_c_seq { \__simeon_plus: } \\
  \midrule
  & \int_eval:n { #2 * #3 }
  \end{tabular}
 }

\cs_new_protected:Nn \__simeon_zero: { \hphantom{0} }
\cs_new_protected:Nn \__simeon_plus:
 {
  \\
  \raisebox{0.6667\normalbaselineskip}[0pt][0pt]{+\,}
  \\[-\normalbaselineskip]
 }
\ExplSyntaxOff

\begin{document}

% center align
\multiplication{2314}{12}
\multiplication{9999}{99}
\multiplication{9999}{9999}

\bigskip

% top align
\multiplication[t]{2314}{12}
\multiplication[t]{9999}{99}
\multiplication[t]{9999}{9999}

\bigskip

% bottom align
\multiplication[b]{2314}{12}
\multiplication[b]{9999}{99}
\multiplication[b]{9999}{9999}

\bigskip

% only multiplication
\multiplication*{2314}{12}\par
\multiplication*{9999}{99}\par
\multiplication*{9999}{9999}

\end{document}

enter image description here

A version that swaps the numbers for doing the computation, if the first is less than the second. It also works with floating point numbers (the alignment is not perfect, in this case, though, at the moment.

\documentclass{article}
\usepackage{xparse,siunitx,booktabs,multirow}

\sisetup{output-decimal-marker={,}}

\ExplSyntaxOn
\NewDocumentCommand{\multiplication}{sO{c}mm}
 {
  \group_begin:
  \sisetup { group-separator = {} }
  \tl_set:Nn \l__simeon_multiplication_do_tl { \num{#3}.\num{#4} }
  \IfBooleanTF { #1 }
   {
    \simeon_multiplication_inline:nn { #3 } { #4 }
   }
   {
    \simeon_multiplication:nnn { #2 } { #3 } { #4 }
   }
  \group_end:
 }

\tl_new:N \l__simeon_multiplication_do_tl
\tl_new:N \l__simeon_multiplication_a_tl
\tl_new:N \l__simeon_multiplication_b_tl
\seq_new:N \l__simeon_multiplication_b_seq
\seq_new:N \l__simeon_multiplication_c_seq
\int_new:N \l__simeon_multiplication_step_int
\fp_new:N \l__simeon_multiplication_result_fp

\cs_new_protected:Nn \simeon_multiplication_inline:nn
 {
  \tl_set:Nn \l__simeon_multiplication_a_tl { #1 }
  \tl_set:Nn \l__simeon_multiplication_b_tl { #2 }
  \tl_replace_once:Nnn \l__simeon_multiplication_a_tl { , } { . }
  \tl_replace_once:Nnn \l__simeon_multiplication_b_tl { , } { . }
  \ensuremath
   {
    \l__simeon_multiplication_do_tl =
    \num
     {
      \fp_eval:n
       {
        \l__simeon_multiplication_a_tl * \l__simeon_multiplication_b_tl
       }
     }
   }
 }


\cs_new_protected:Nn \simeon_multiplication:nnn
 {
  % store the second factor in reverse order
  \tl_set:Nn \l__simeon_multiplication_a_tl { #2 }
  \tl_set:Nn \l__simeon_multiplication_b_tl { #3 }
  \tl_replace_once:Nnn \l__simeon_multiplication_a_tl { , } { . }
  \tl_replace_once:Nnn \l__simeon_multiplication_b_tl { , } { . }
  \fp_set:Nn \l__simeon_multiplication_result_fp
   {
    \l__simeon_multiplication_a_tl * \l__simeon_multiplication_b_tl
   }
  \fp_compare:nTF { \l__simeon_multiplication_a_tl > \l__simeon_multiplication_b_tl }
   {
    \__simeon_multiplication:nNN { #1 } \l__simeon_multiplication_a_tl \l__simeon_multiplication_b_tl
   }
   {
    \__simeon_multiplication:nNN { #1 } \l__simeon_multiplication_b_tl \l__simeon_multiplication_a_tl
   }
 }

\cs_new_protected:Nn \__simeon_multiplication:nNN
 {
  % find the number of final zeros
  \tl_clear:N \l__simeon_multiplication_zeros_tl
  \__simeon_multiplication_zeros:NN #2 #3
  % remove the decimal separator
  \tl_remove_once:Nn #2 { . }
  \tl_remove_once:Nn #3 { . }
  % store the second factor in reverse order
  \seq_set_split:NnV \l__simeon_multiplication_b_seq { } #3
  \seq_reverse:N \l__simeon_multiplication_b_seq
  % store the partial products with a padding
  \seq_clear:N \l__simeon_multiplication_c_seq
  \int_zero:N \l__simeon_multiplication_step_int
  \seq_map_inline:Nn \l__simeon_multiplication_b_seq
   {
    \seq_put_right:Nx \l__simeon_multiplication_c_seq
     {
      &\int_eval:n { #2 * ##1 }
      \prg_replicate:nn { \l__simeon_multiplication_step_int } { \__simeon_zero: }
     }
    \int_incr:N \l__simeon_multiplication_step_int
   }
  \begin{tabular}[#1]{@{}r@{}r@{}}
  \multicolumn{2}{@{}r@{}}{\l__simeon_multiplication_do_tl} \\
  \midrule
  \multirow{\tl_count:N #3}{*}{\raisebox{\depth}{+}\,}
  \seq_use:Nn \l__simeon_multiplication_c_seq { \\ } \\
  \midrule
  & \num{ \fp_use:N \l__simeon_multiplication_result_fp }
    \l__simeon_multiplication_zeros_tl
  \end{tabular}
 }

\cs_new_protected:Nn \__simeon_zero: { \hphantom{0} }
\cs_new_protected:Nn \__simeon_plus:
 {
  \\
  \raisebox{0.66667\normalbaselineskip}[0pt][0pt]{+\,}
  \\[-\normalbaselineskip]
 }

\cs_new_protected:Nn \__simeon_multiplication_zeros:NN
 {
  \seq_set_split:NnV \l_tmpa_seq { . } #1
  \seq_set_split:NnV \l_tmpb_seq { . } #2
  \tl_set:Nx \l_tmpa_tl
   {
    \seq_item:Nn \l_tmpa_seq { 2 }
    \seq_item:Nn \l_tmpb_seq { 2 }
   }
  \tl_set:Nx \l_tmpb_tl { \fp_eval:n { #1 * #2 } }
  \seq_set_split:NnV \l_tmpa_seq { . } \l_tmpb_tl
  \tl_set:Nx \l_tmpb_tl { \seq_item:Nn \l_tmpa_seq { 2 } }
  \tl_set:Nx \l__simeon_multiplication_zeros_tl
   {
    \prg_replicate:nn { \tl_count:N \l_tmpa_tl - \tl_count:N \l_tmpb_tl } { 0 }
   }
 }

\ExplSyntaxOff

\begin{document}

% center align
\multiplication{2314}{12}\quad
\multiplication{12}{2314}\quad
\multiplication{9999}{99}\quad
\multiplication{9999}{9999}\quad
\multiplication{23,14}{1,2}\quad
\multiplication{235}{388}\quad
\multiplication{2,35}{38,8}

\bigskip

% top align
\multiplication[t]{2314}{12}\quad
\multiplication[t]{12}{2314}\quad
\multiplication[t]{9999}{99}\quad
\multiplication[t]{9999}{9999}\quad
\multiplication[t]{23,14}{1,2}

\bigskip

% bottom align
\multiplication[b]{2314}{12}\quad
\multiplication[b]{12}{2314}\quad
\multiplication[b]{9999}{99}\quad
\multiplication[b]{9999}{9999}\quad
\multiplication[b]{23,14}{1,2}

\bigskip

% only multiplication
\multiplication*{2314}{12}\par
\multiplication*{12}{2314}\par
\multiplication*{9999}{99}\par
\multiplication*{9999}{9999}\par
\multiplication*{23,14}{1,2}

\end{document}

enter image description here

egreg
  • 1,121,712
  • That's good but I changed my calculations. I need the second one which is marked in pink, which is a lot simpler for 12yo kids. https://imgur.com/a/IEOWqTL And if it's possible to work with floating points numbers? I knew only I had to replace 2-3 function in my example for this. – Simeon Simeonov Apr 14 '19 at 11:33
  • 1
    @SimeonSimeonov Yes, it's possible. The added version checks for the largest number and works with floating point numbers. A hint about what alignment you expect in the floating point number case is needed. – egreg Apr 14 '19 at 13:05
  • Nice. There is something a bit wrong. The result is moved to the right with one char and there is no zero. https://imgur.com/a/XGFyI40 And I think only one plus is enough(like the red in the picture) but it has to be centered in the middle of the list always. – Simeon Simeonov Apr 14 '19 at 13:29
  • 1
    @SimeonSimeonov Fixed according to your wish – egreg Apr 14 '19 at 13:57
  • 1
    @SimeonSimeonov I'm not going to spend more time on this, sorry. Look at the documentation of siunitx for avoiding exponential notation. The output of 18 times 12,7 seems right (except for the alignment, which I asked you hints for and you never said anything). – egreg Apr 14 '19 at 20:14
  • @SimeonSimeonov Please, remove the tick and I'll remove my answer, so you don't need to ask a duplicate question. – egreg Apr 14 '19 at 20:18
  • Sorry for the lack of hints, it's my fault because I want something very complicated with a lot of changes over the time. I will remove my last comments you did a great job. – Simeon Simeonov Apr 14 '19 at 21:07