Org mode 中的表格的另外一个强大之处,在于它支持公式。在表格区域使用快捷键 "C-c '",就可以对表格公式进行编辑,完成后公式会显示在表格下方,以 "#+TBLFM:" 开头,如下图所示。
使用 "C-c '" 后能在一个独立的、临时的 buffer 中编辑公式,但我们也可以在表格下方手工添加以 "+TBLFM:" 开头的行,然后直接添加公式。
上面这个公式表示将第四列的值设为第二列的值与第三列的值的乘积。在编辑好公式并保存后,将光标移动到公式所在行然后使用 "C-c C-c",就可以应用公式到表格中。如下图所示:
在Org mode的表格公式中,用 "@" 来表示行,用 "$" 来表示列,最简单的,"@3$2" 表示的是第三行第二列的位置。使用快捷键 "C-c }" 可以开启表格的横纵坐标显示——若要关闭的话也是用它。如果是用 "C-c '" 来进行公式编辑,在输入表格位置时,会看到表格上对应的位置会在当时高亮,所以建议用这种方式进行编辑。
如果只给一个坐标,则另一个坐标会被设为"当前行"或者"当前列",这在批量处理表格内容时会有用。
如果想表示一个区域的话,用 ".." 来表示。
下面这个表示左上角为第二行第一列单元格、右下角为第四行第三列单元格的区域,共包含 9 个单元格。
@2$1..@4$3
下面这个则表示"当前行"的第一列到第三列的区域:
$1..$3
在公式中,可以用 "@#" 表示当前行的行号,用 "$#" 表示当前列的列号,在一些稍复杂点的公式里会有用。
此外,还可以定义常量、变量,或者给某个单元格命名,然后引用它们。假设其名字为 "name",那么 "$name" 就可以引用它了。常量的定义可以通过 "org-table-formula-constants" 来进行,这样定义的常量是全局的;如果要定义局部的常量,可以在org文件中添加诸如这样的行:
#+CONSTANTS: pi=3.14 eps=2.4e-6
还可以在当前表格引用其他表格的域,这需要其他表格被命名为某个名字,如"FOO",我们要在另一个表格中使用其第三行第四列的域,将其值赋给当前表格的第五行第二列,则可以这样写:
@5$2=remote(FOO, @3$4)
下图将被命名为 "fruit_expend" 的表格的第 6 行第 4 列的数据插入到新表格的第二行第二列中:
Org mode 的表格公式中,四则运算符都能正常使用,不过略有不同——乘号 "*" 的优先级要比除号 "/" 要高,因此
$3 / $2 * $1
会被解释为
$3 / ($2 * $1)
Org mode 默认使用的是 Emacs 中自带的 Calc 这个 package 来进行计算,而 Calc 中提供了相当丰富的计算方法,这里列举一二:
基础算术方法: abs, sign, inv, sqrt, min, max,详见 Arithmetic Functions
对数方法: ln, exp, log,详见 Logarithmic Functions
随机数方法: random
向量/矩阵方法: vunion, vint, vsum, vmean, vmax, vmin, vmedian,详见 Vector/Matrix Functions
Calc 的内容比较多,这里不做深入展开,有需要的话可以参考 GNU Emacs Calc Manual。
此外,表格公式还能以 Emacs Lisp 的形式来进行编写,不过要在这种形式的公式前加上单引号 "'",才能正确求值。在 Emacs Lisp 形式的公式表达式中,传入的参数会被当作字符串,所有需要用格式化选项 "N" 来指明参数类型都是数值。如下图,在不加格式化选项时,公式计算出错,加上 ";N" 后才得到了正确的结果。
所有的格式化选项,必须通过分号 ";" 和公式进行分隔并跟随在公式后面,可用的选项有:
p: 设置计算精度
n/s/e/f: 设置结果的输出格式
n3: 输出结果为3位有效数字(1.45)
s3: 输出结果为科学计数法,3位有效数字(1.45e0)
e3: 输出结果为工程计数法,3位有效数字(0.145e1)
f3: 输出结果精确至小数点后3位
D/R: 计算时使用角度制还是弧度制(如三角函数)
F/S: 分数还是符号(当为 S 时,若结果不为整数,则显示式子本身,如: sqrt(6))
T/t: 时间计算,要求用于计算的值是"HH:MM[:SS]"的形式,当使用 T 时,输出结果是 "HH:MM:SS" 形式;使用 "t" 时,结果显示为一个数值,默认情况下单位是小时,可以通过变量 org-table-duration-custome-format 来设置
E: 不使用时,所有空白单元格都会被跳过,不会包含在计算过程中;当使用时,如果还使用了 N ,则用 "0" 填充;否则,在普通公式中,用 "nan" 填充,在 emacs lisp 公式中,用空字符串填充
N: 使用时,将所有域的值视为数字,对于非数值型,用 0 替代
L: 只用于 emacs lisp 公式,后续
如果需要对表格公式的求值进行调试,可以通过快捷键"C-c {"来开启调试模式(或者关闭它)。