
Как бы вы написали ручное суммирование чисел в TeX? То есть, что-то вроде этого (не обязательно идентично):
решение1
Одним из возможных решений может стать простая таблица.
\begin{table}[h]
\begin{tabular}{r}
1234 \\
345 \\
+6543 \\
345 \\ \hline
8467
\end{tabular}
\end{table}
Редактировать: Результаты следующие:
решение2
Ради интереса я предлагаю эту автоматизированную альтернативу. Она \convertchar
превращает разделенный пробелом ввод в +
разделенный ввод, к которому \numexpr
можно применить. Я использую выровненные по правому краю стеки для составления результата.
\documentclass{article}
\usepackage{stringstrings,stackengine}
\newcounter{mysum}
\newcommand\showsum[1]{%
\convertchar[q]{#1}{ }{+}%
\setcounter{mysum}{\numexpr\thestring\relax}%
\def\stackalignment{r}%
{\ttfamily\stackunder{\underline{+\Longstack{#1}}}{\themysum}}%
}
\begin{document}
\showsum{1 2 3 4} $\qquad$
\showsum{23 567 34 32} $\qquad$
\showsum{1 3567 2334 3352 567}
\end{document}
решение3
Предоставьте вычисления TeX.;-)
\documentclass{article}
\usepackage{xparse,array,booktabs}
\ExplSyntaxOn
\NewDocumentCommand{\computesum}{sO{}m}
{
\chubakueno_computesum:n { #3 }
\IfBooleanTF{#1}
{
\ensuremath { \int_to_arabic:n { \l_chubakueno_sum_int } }
}
{
\group_begin:
\chubakueno_typesetsum:n { #2 }
\group_end:
}
}
\int_new:N \l_chubakueno_sum_int
\seq_new:N \l_chubakueno_summands_seq
\seq_new:N \l_chubakueno_output_summands_seq
\seq_new:N \l__chubakueno_temp_seq
\tl_new:N \l_chubakueno_total_tl
\tl_new:N \l__chubakueno_temp_tl
\cs_generate_variant:Nn \int_set:Nn { Nx }
\keys_define:nn { chubakueno/sum }
{
spacing .dim_set:N = \l_chubakueno_spacing_dim,
align .tl_set:N = \l_chubakueno_align_tl,
align .initial:n = c,
}
\cs_new_protected:Npn \chubakueno_computesum:n #1
{
\int_set:Nn \l_chubakueno_sum_int { #1 }
\seq_set_split:Nnn \l_chubakueno_summands_seq { + } { #1 }
}
\cs_new_protected:Npn \chubakueno_typesetsum:n #1
{
\keys_set:nn { chubakueno/sum } { #1 }
\dim_compare:nTF { \l_chubakueno_spacing_dim = 0pt }
{% do nothing if the space is zero
\seq_set_eq:NN \l_chubakueno_output_summands_seq \l_chubakueno_summands_seq
\tl_set:NV \l_chubakueno_total_tl \l_chubakueno_sum_int
}
{% else add the interline space
\seq_map_inline:Nn \l_chubakueno_summands_seq
{
\seq_set_split:Nnn \l__chubakueno_temp_seq { } { ##1 }
% insert the interdigits space
\__chubakueno_insert_space:N \l__chubakueno_temp_tl
\seq_put_right:NV \l_chubakueno_output_summands_seq \l__chubakueno_temp_tl
}
\seq_set_split:NnV \l__chubakueno_temp_seq { } \l_chubakueno_sum_int
\__chubakueno_insert_space:N \l_chubakueno_total_tl
}
\begin{tabular} [\l_chubakueno_align_tl] { >{$}r<{$} @{$\;$} >{$}r<{$} }
& \seq_use:Nnnn \l_chubakueno_output_summands_seq { \\ + & } { \\ & } { \\ + & }
\\
\midrule
& \tl_use:N \l_chubakueno_total_tl
\end{tabular}
}
\cs_new_protected:Npn \__chubakueno_insert_space:N #1
{
\tl_set:Nx #1
{
\seq_use:Nn \l__chubakueno_temp_seq { \skip_horizontal:n { \l_chubakueno_spacing_dim } }
}
}
\ExplSyntaxOff
\begin{document}
Just the sum: \computesum*{345+6543+345}
The unspaced sum: \computesum{345+6543+345}
Spaced sum: \computesum[spacing=.1em,align=b]{640+231+100+91+1003}
Top aligned: \computesum[align=t,spacing=.2em]{333 + 333 + 333 + 2}
\end{document}
Первая задача — вычислить сумму, сохранив ее в целочисленной переменной. Слагаемые также сохраняются в последовательности для последующей обработки. Если \computesum*
вызывается just, выводится только сумма.
При обычном вызове оцениваются некоторые возможные параметры: spacing
is для межцифрового пробела (по умолчанию ноль), align
is для общего выравнивания таблицы, it can be c
(по умолчанию) t
или b
. Пробелы вокруг +
обязательного аргумента игнорируются.
Затем таблица строится путем сохранения слагаемых с межзначным пробелом в новой последовательности, которая используется в tabular
. Последняя строка таблицы строится аналогичным образом из итога.