像纸上计算一样对数字求和

像纸上计算一样对数字求和

我需要制作很多这样的。如果可以的话,数字可以正确对齐。怎么做?在此处输入图片描述

答案1

A无包装也适用于三项或更多项的方法。

\documentclass{article}

\newcommand{\showsum}[2][c]{%
  $\edef\originalplusmathcode{\the\mathcode`+}%
   \begingroup\lccode`~=`+ \lowercase{\endgroup\def~}{\\&}%
   \mathcode`+ "8000
  \begin{array}[#1]{@{}r@{\;}r@{}}
   \mathchar\originalplusmathcode& #2 \\
  \hline
  & \the\numexpr#2\relax
  \end{array}%
  $%
 }

\begin{document}

X\quad % to show the baseline
\showsum{12345 + 6543}\quad
\showsum{521725 + 256814}\quad
\showsum{523057 + 6743}\quad
\showsum[t]{57208+6207}\quad
\showsum[b]{57208+6207+12095}\quad
X

\end{document}

在此处输入图片描述

这里的 X 表示基线。(抄袭自@egreg)


变体显示:

\documentclass{article}

\newcommand{\showsum}[2][c]{%
  $\edef\originalplusmathcode{\the\mathcode`+}%
   \begingroup\lccode`~=`+ \lowercase{\endgroup\def~}{\\\mathchar\originalplusmathcode&}%
   \mathcode`+ "8000
  \begin{array}[#1]{@{}r@{\;}r@{}}
   & #2 \\
  \hline
  =& \the\numexpr#2\relax
  \end{array}%
  $%
 }

\begin{document}

X\quad % to show the baseline
\showsum{12345 + 6543}\quad
\showsum{521725 + 256814}\quad
\showsum{523057 + 6743}\quad
\showsum[t]{57208+6207+77777}\quad
\showsum[b]{57208+6207+12095+33333}\quad
X

\end{document}

在此处输入图片描述


我们还可以对负整数求和:

\documentclass{article}

\newcommand{\showsum}[2][c]{%
  $\edef\originalplusmathcode{\the\mathcode`+}%
   \begingroup\lccode`~=`+ \lowercase{\endgroup\def~}{\\\mathchar\originalplusmathcode&}%
   \edef\originalminusmathcode{\the\mathcode`-}%
   \begingroup\lccode`~=`- \lowercase{\endgroup\def~}{\\\mathchar\originalminusmathcode&}%
   \mathcode`+ "8000
   \mathcode`- "8000
  \begin{array}[#1]{@{}r@{\;}r@{}}
   & #2 \\
  \hline
  =& \the\numexpr#2\relax
  \end{array}%
  $%
 }

\begin{document}

X\quad % to show the baseline
\showsum{12345 - 6543}\quad
\showsum{521725 + 256814}\quad
\showsum{523057 - 6743}\quad
\showsum[t]{57208-6207+77777}\quad
\showsum[b]{57208-6207+12095-33333}\quad
X

\end{document}

在此处输入图片描述

(三者的%决赛后都有缺失,现已修复,但图像尚未更新)$\showsum

答案2

下面的代码定义了一个宏,\Summation它接受以逗号分隔的整数列表,例如

  \Summation{12345, 6543}
  \Summation{521725, 256814}
  \Summation{523057, 6743}
  \Summation{57208,6207}
  \Summation[b]{57208,6207,12095}

然后,宏将整数添加到表中,如 OP 中所示。上面的命令给出输出:

在此处输入图片描述

有一个可选的第一个参数,它成为环境中的定位可选参数tabular(默认情况下t使用)。我还没有真正检查过,但它可能会因大整数而中断。

所有整数都使用\num来自的命令打印希尼奇包,因此可以使用以下方式定制它们的格式希尼奇例如,通过添加

\sisetup{group-separator={,},group-four-digits}

数字之间会用逗号分隔千位、百万位……等,这样输出就变成

在此处输入图片描述

代码是使用LaTeX3

\documentclass{article}
\usepackage{xparse}
\usepackage{siunitx}

\ExplSyntaxOn
\clist_new:N \l_int_clist
\int_new:N \g_total_int
\tl_new:N \g_summation_tl
\NewDocumentCommand\Summation {O{t} m}{
  \clist_set:Nn \l_int_clist {#2}
  \int_zero:N \g_total_int
  \tl_clear:N \g_summation_tl
  \clist_map_inline:Nn \l_int_clist {
    \int_gadd:Nn \g_total_int {##1}
    \tl_gput_right:No \g_summation_tl {& \num{##1}\\}
   }
   \begin{tabular}[#1]{r@{\space}r}
     + \tl_use:N \g_summation_tl \cline{2-2}
     &\num{\int_use:N \g_total_int}
  \end{tabular}
}
\ExplSyntaxOff

\begin{document}

  \Summation{12345, 6543}
  \Summation{521725, 256814}
  \Summation{523057, 6743}
  \Summation{57208,6207}
  \Summation[b]{57208,6207,12095}

\end{document}

正如所指出的Latex3 内联映射在表格中产生额外的行,有必要将表构建为标记列表,否则\hrule会抱怨。

答案3

让 TeX 进行计算

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\showsum}{O{c}m}
 {
  \ensuremath
   {
    \simeon_showsum:nn { #1 } { #2 }
   }
 }

\seq_new:N \l__simeon_showsum_seq

\cs_new_protected:Nn \simeon_showsum:nn
 {
  \seq_set_split:Nnn \l__simeon_showsum_seq { + } { #2 }
  \begin{array}[#1]{@{}r@{\;}r@{}}
  + & \seq_use:Nn \l__simeon_showsum_seq { \\ & } \\
  \hline
  & \int_eval:n { #2 }
  \end{array}
 }
\ExplSyntaxOff

\begin{document}

X\quad % to show the baseline
\showsum{12345 + 6543}\quad
\showsum{521725 + 256814}\quad
\showsum{523057 + 6743}\quad
\showsum[t]{57208+6207}\quad
\showsum[b]{57208+6207+12095}\quad
X

\end{document}

在此处输入图片描述

答案4

这是一个基于 LuaLaTeX 的解决方案。该宏\mysum有两个强制参数(要求和的数字)和一个可选参数,该参数决定环境array相对于数学基线的垂直放置方式:居中(默认)、顶部对齐或底部对齐。(如果设置了可选参数,则必须按照通常的 LaTeX 宏语法规则将其列在首位并用方括号括起来。)

在此处输入图片描述

\documentclass{article}
\usepackage{booktabs} % for "\midrule" macro
\newcommand{\mysum}[3][c]{%
   \begin{array}[#1]{@{}r@{}}
      #2 \\ {+}\: #3 \\ \midrule \directlua{tex.sprint(#2+#3)}
   \end{array}}
\usepackage{newtxtext,newtxmath} % optional (Times Roman text and math fonts)
\begin{document}
\[
\mysum{12345}{6543}       \qquad
\mysum{511725}{256814}    \qquad
\mysum[b]{523057}{6743}   \qquad
\mysum[t]{57208}{6207}
\]
\end{document}

附录允许任意数量的加数,而不是恰好两个加数。前面的代码处理了原始查询中提供的情况,其中涉及求和中的恰好两个项。以下解决方案仍然基于 LuaLaTeX,允许任意数量的加数。它的工作原理如下:

  • LaTeX 宏\mysum接受一个可选参数(垂直位置指示符,见上文)和一个强制参数:一串逗号分隔的数字。字符串内允许有空格。因此,\mysum{12345,6543}\mysum{12345, 6543}\mysum{ 12345 , 6543 }\mysum{12345,6543 }都同样有效 - 并产生相同的输出,, 号码18888

  • \mysum宏执行以下任务:它设置一个array环境,调用 Lua 函数perform_summation执行大部分实际工作,然后终止array环境。

  • Luaperform_summation函数首先将逗号分隔的数字字符串拆分成 Lua 表,使用,作为分隔符。(执行拆分的辅助函数来自 stackoverflow。)perform_summation然后迭代表条目以 (a) 计算条目的累计小计和 (b) 在单独的行上打印出每个条目。最后,Lua 函数打印条目总和的值。

-位于以下屏幕截图左侧和右侧边缘的3 个“ ”符号仅用于指示数学轴的位置。

在此处输入图片描述

\documentclass{article}
\usepackage{newtxtext,newtxmath} % optional: Times Roman text and math fonts
\usepackage{booktabs} % for "\midrule" macro
\usepackage{luacode}  % for "luacode" environment

%% Lua-side code:
\begin{luacode}
-- The following code is from https://stackoverflow.com/a/19263313:
function string:split( inSplitPattern )
  outResults = { }
  local theStart = 1
  local theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  while theSplitStart do
    table.insert( outResults, string.sub( self, theStart, theSplitStart-1 ) )
    theStart = theSplitEnd + 1
    theSplitStart, theSplitEnd = string.find( self, inSplitPattern, theStart )
  end
  table.insert( outResults, string.sub( self, theStart ) )
  return outResults
end

function perform_summation ( s )
  t = s:split(",")
  sum = 0 -- initialize "sum" variable
  tex.sprint ( "+\\:" ) -- print the "+" symbol
  for i=1,#t do
    sum = sum+t[i]
    tex.sprint ( t[i] .. "\\\\" )
  end
  tex.sprint ( "\\midrule" .. sum )
end
\end{luacode}

%% LaTeX-side code:
\newcommand{\mysum}[2][c]{%
   \begin{array}[#1]{@{}r@{}}
      \directlua{perform_summation("#2")}
   \end{array}}

\begin{document}
\[
---\quad  % indicate math axis
\mysum{12345,6543}       \qquad
\mysum{1234567891234,9876543219877} \qquad
\mysum{1,2,3,4} \qquad
\mysum[t]{ 57208 , 6207 , 12095 } \qquad
\mysum[b]{12345,67890}
\quad---{}   % indicate math axis
\]
\end{document}

相关内容