不知道 TeX 系统有没有这个功能,比如在表格中给定一个公式,可以应用公式计算后显示数据。
答案1
有包裹spreadtab
它提供了类似电子表格的功能。以下示例取自文档:
\documentclass{article}
\usepackage{spreadtab}
\begin{document}
\begin{spreadtab}{{tabular}{rr|r}}
22 & 54 & a1+b1 \\
43 & 65 & a2+b2 \\
49 & 37 & a3+b3 \\
\hline
a1+a2+a3 & b1+b2+b3 & a4+b4
\end{spreadtab}
\begin{spreadtab}{{tabular}{|r|ccc|}}
\hline
@ values of $x$ & -5 & -1 & 4 \\
@ $f(x)=2x$ & 2*[0,-1] & 2*[0,-1] & 2*[0,-1] \\
\hline
\end{spreadtab}
\begin{spreadtab}{{tabular}{|c|*{10}{c}|}}
\hline
@$\times$ & 1 & \STcopy{>}{b1+1} & & & & & & & & \\
\hline
1 & \STcopy{>,v}{!a2*b!1} & & & & & & & & & \\
\STcopy{v}{a2+1} & & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
& & & & & & & & & & \\
\hline
\end{spreadtab}
\end{document}
答案2
这是一个使用 R、knitr 和 xtable 制作 LaTeX 表的简单示例。
假设您有以下文档,名为test.rnw
\documentclass{article}
\begin{document}
<<results='asis', echo=FALSE>>=
library(xtable)
sheet <- data.frame(x=c(1,2,3,4,5), y=c(10, 20, 30, 40, 50))
sheet$z <- sheet$x + sheet$y
print(xtable(sheet))
@
\end{document}
简而言之,文件中<<>>=
和之间的代码被新文件中生成的 latex 输出所替换。特别是,是一个可以将数据框转换为 latex 表的包和函数。它有大量的选项,但在上面的例子中,我依赖于默认值。@
rnw
tex
xtable
要将文件转换为 latex,然后转换为 pdf,您只需在名为的开源 R IDE 中打开 rnw 文件即可RStudio并点击“编译 PDF”。或者您也可以从命令行发出这样的命令。
Rscript -e 'library(knitr); knit("test.rnw")'
pdflatex test.tex
它会产生如下输出:
要运行上述示例,您需要安装:
- 回覆:http://www.r-project.org/
- knitr:
install.packages('knitr')
在 R 中 - xtable:
install.packages('xtable')
在 R 中
欲了解更多信息请访问 knitr 网站:http://yihui.name/knitr/
答案3
如果您使用 LuaTeX,您可以使用任何 C 数学库扩展 TeX 并创建 Lua 绑定。
要创建必要的绑定程序 温差可以使用。下面是一个 ConTeXt 示例,它使用帕里/GP代数系统来进行计算。
生成绑定
文件:pari.i
%module pari
%{
#include "pari.h"
ulong overflow;
%}
%ignore gp_variable(char *s);
%ignore setseriesprecision(long n);
%ignore killfile(pariFILE *f);
%ignore pari_vfprintf(FILE *file, const char *fmt, va_list ap);
%ignore pari_vprintf(const char *fmt, va_list ap);
%ignore pari_vsprintf(const char *fmt, va_list ap);
%ignore out_vprintf(PariOUT *out, const char *fmt, va_list ap);
%include "pari/parisys.h";
%include "pari/paristio.h";
%include "pari/paricom.h";
%include "pari/parigen.h";
%include "pari/paridecl.h";
%include "pari/parierr.h";
%include "pari/paricast.h";
%include "pari/paritune.h";
%include "pari/pariinl.h";
%inline %{
GEN uti_mael2(GEN m,long x1,long x2)
{return mael2(m,x1,x2);}
%}
使用以下方式生成绑定
swig -lua -I/usr/include pari.i
然后编译模块
gcc -ansi -I/usr/include/pari -I/usr/include/lua5.1 -fPIC -c pari_wrap.c -o pari_wrap.o
gcc -Wall -ansi -shared -I/usr/include/pari pari_wrap.o -lpari -lm -o pari.so
现在该模块可以在 LuaTeX 中使用require("pari")
。
使用库
\startluacode
require("pari")
pari.pari_init(4000000,500000)
thirddata = thirddata or {}
local function sum(X,a,b,expr,start)
local start = start or '0.'
local res = pari.gp_read_str(string.format(
"sum(%s=%s,%s,%s,%s)",X,a,b,expr,start))
res = pari.GENtoTeXstr(res)
return res
end
thirddata.sum = sum
\stopluacode
\starttext
\startformula
\sum_{k=0}^{30}\frac{4(-1)^k}{2k+1}=
\luacode{context(thirddata.sum(
"k",0,30,"4*(-1)^k/(2*k+1)","0"))}
\stopformula
\startformula
\sum_{k=0}^{3}\frac{1}{x^2+k}=
\luacode{context(thirddata.sum(
"k",0,3,"1/(x^2+k)","0"))}
\stopformula
\stoptext
该代码的运行结果:
由于此方法不使用任何 ConTeXt 功能,因此此代码只需进行少量修改即可在 LaTeX 中运行。但是,它仅适用于 LuaTeX。
此描述基于 讲话 由 Luigi Scarso 在 BachoTeX 2011 上发表。所有荣誉均归于他。