我的目标是创建一个插入表格的命令,该命令将格式化表格,并在给定仅包含行的原始数据的文件的情况下对其值添加计算。
\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}
结果: