我需要制作很多这样的。如果可以的话,数字可以正确对齐。怎么做?
答案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
环境。Lua
perform_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}