在电子表格环境中使用输入进行计算

在电子表格环境中使用输入进行计算

我的目标是创建一个插入表格的命令,该命令将格式化表格,并在给定仅包含行的原始数据的文件的情况下对其值添加计算。

\documentclass{article}
\usepackage{spreadtab,booktabs,xpatch}
\begin{document}

\begin{spreadtab}{{tabular}{lcc}}
\toprule
@ Product name & @ Price & @ Count \\
\midrule
\input{products}
\midrule
@ Total & :={sumprod(b2:[0,-1];c2:[1,-1])} & sum(c2:[0,-1]) \\
\bottomrule
\end{spreadtab}

\end{document}

其中products.tex包括

@ Plant &  60 &  2 \\
@ Book  &  90 &  4 \\
@ Other & 100 & 10 \\

将的线条粘贴products.tex到上面匹配的位置就可以顺利完成了。 使用原始文本的表格

我希望将上述代码作为命令,这样我就可以使用相同的代码输入不同的表格值,而无需重复标题和计算定义。但是,使用的最终结果input总是将总和值保留为 0,并且字母@现在是文本的一部分:

使用输入后的表格

我猜测在插入输入之前,spreadtab 的处理就已经完成了——但我想知道是否有办法解决它。

接下来是这个问题:在表格内执行 \input 时无法使用 \toprule——为什么?,我尝试将原始 tex 输入添加到 spreadtab 环境中。也就是说,我使用了

\makeatletter
\newcommand\primitiveinput[1]{\@@input #1 }
\makeatother

并将该行替换\input{products}\primitiveinput{products}。但还是没有运气——我得到了与使用 完全相同的输出input

有任何想法吗?

答案1

这是一个解决方法。所有\input{<name>}内容都由spreadtab 环境中的文件内容替换:

\documentclass{article}
\begin{filecontents*}{products.tex}
@ Plant &  60 &  2 \\
@ Book  &  90 &  4 \\
@ Other & 100 & 10 \\
\end{filecontents*}
\usepackage{spreadtab,booktabs,xpatch}
\makeatletter
\def\spreadtab@ii{\IfSubStr\ST@tab{\noexpand\input}{\expandafter\spreadtab@iii\ST@tab\@nil}\relax}
\def\spreadtab@iii#1\input#2#3\@nil{%
    \long\def\spreadtab@iv##1\spreadtab@iv{\endgroup\def\ST@tab{#1##1#3}\spreadtab@ii}%
    \begingroup
        \everyeof{\spreadtab@iv\noexpand}%
        \expandafter\spreadtab@iv\@@input#2
}
\xpretocmd\spreadtab@i\spreadtab@ii{}{}
\makeatother
\begin{document}
\begin{spreadtab}{{tabular}{lcc}}
    \toprule
    @ Product name & @ Price & @ Count \\
    \midrule
    \input{products}
    \midrule
    @ Total & :={sumprod(b2:[0,-1];c2:[1,-1])} & sum(c2:[0,-1])\\
    \bottomrule
\end{spreadtab}
\end{document}

答案2

您忘记包含\usepackage{booktabs}

您的代码可能是:

\documentclass{article}
\usepackage{booktabs}
\usepackage{spreadtab}
\begin{document}
\begin{spreadtab}{{tabular}{lcc}}
\toprule
@ Product name & @ Price & @ Count \\
\midrule
@ product & 60 & 2\\
@ book    & 90 & 4 \\
@ pen     & 40 &10\\
@ other   &100 &10\\
\midrule
@ Total & :={sumprod(b2:[0,-1];c2:[1,-1])} & sum(c2:[0,-1])\\
\bottomrule
\end{spreadtab}
\end{document}

结果:

电子表格

相关内容