
Wie würden Sie eine manuelle Summierung von Zahlen in TeX schreiben? Das heißt, ungefähr so (nicht unbedingt identisch):
Antwort1
Eine mögliche Lösung könnte eine einfache Tabelle sein.
\begin{table}[h]
\begin{tabular}{r}
1234 \\
345 \\
+6543 \\
345 \\ \hline
8467
\end{tabular}
\end{table}
Bearbeiten: Ergebnisse in folgendem:
Antwort2
Nur zum Spaß biete ich diese automatisierte Alternative an. Sie \convertchar
wandelt die durch Leerzeichen getrennte Eingabe in eine +
getrennte Eingabe um, auf die \numexpr
angewendet werden kann. Ich verwende rechtsbündige Stapel, um das Ergebnis zusammenzustellen.
\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}
Antwort3
Überlassen Sie die Berechnung 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}
Die erste Aufgabe besteht darin, die Summe zu berechnen und sie in einer Integer-Variable zu speichern. Die Summanden werden auch in einer Sequenz gespeichert, um sie später verarbeiten zu können. Wenn just \computesum*
aufgerufen wird, wird nur die Summe ausgegeben.
Beim normalen Aufruf werden einige mögliche Optionen ausgewertet: spacing
steht für den Abstand zwischen den Ziffern (Standard 0), align
steht für die Gesamtausrichtung der Tabelle, kann stehen c
(Standard) t
oder b
. Leerzeichen +
im obligatorischen Argument werden ignoriert.
Anschließend wird die Tabelle aufgebaut, indem die Summanden mit dem Interdigit-Abstand in einer neuen Sequenz gespeichert werden, die in einem verwendet wird tabular
. Die letzte Zeile der Tabelle wird auf ähnliche Weise aus der Summe aufgebaut.