要根据表格中其他单元格计算当前单元格,公式必须引用其他单元格或区域。 在 Org 中,单元格可以通过名称、绝对坐标和相对坐标引用。 若要查看某个单元格的坐标,可在该单元格内按下 C-c ?, 或按下 C-c } 切换显示坐标网格。
公式可以通过两种方式引用其他单元格的值。 与其他电子表格一样,你可以用字母+数字的组合如 ‘B3’ 引用单元格, 表示第三行第二个单元格。不过 Org 更推荐使用另一种更通用的表示形式,形如:18
@ROW$COLUMN
列的指定方式可以是绝对引用,如 ‘$1’ 、 ‘$2’ 、…、 ‘$N’ , 也可以是相对于当前列(即正在计算的单元格所在列)的引用,如 ‘$+1’ 或 ‘$-2=。 =$<’ 和 ‘$>’ 分别固定指向第一列和最后一列, 你还可以用 ‘$>>>’ 表示从右数第三列。
行的编号只统计数据行,忽略水平分隔线(hline)。 与列类似,你可以使用绝对行号 ‘@1’ 、 ‘@2’ 、…、 ‘@N’ , 以及相对于当前行的行号,如 ‘@+3’ 或 ‘@-1=。 =@<’ 和 ‘@>’ 分别固定指向表格第一行和最后一行。 你还可以相对于某条水平分隔线指定行: ‘@I’ 指向第一条水平分隔线, ‘@II’ 指向第二条,依此类推。 ‘@-I’ 指向当前行上方的第一条分隔线, ‘@+I’ 指向下方的第一条分隔线。 你也可以写成 ‘@III+2’ ,表示表格第三条分隔线之后的第二行数据。
‘@0’ 和 ‘$0’ 分别指向当前行和当前列, 即正在计算结果的单元格所在行/列。 此外,如果省略引用中的行或列部分,则默认使用当前行/列。
Org 中 无符号数字unsigned() 的引用是固定引用: 如果在两个不同单元格的公式中使用相同引用,每次都指向同一个单元格。 带 符号数字(signed) 的引用是浮动引用: 同一个引用运算符会根据公式计算的目标单元格指向不同位置。
以下是一些示例:
| ‘@2$3’ | 第二行第三列(等同于 =C2=) |
| ‘$5’ | 当前行第五列(等同于 =E&=) |
| ‘@2’ | 当前列第二行 |
| ‘@-1$-3’ | 上一行、左三列的单元格 |
| ‘@-I$2’ | 当前行上方分隔线正下方、第二列的单元格 |
| ‘@>$5’ | 最后一行第五列的单元格 |
你可以通过两个单元格引用以两个点 ‘..’ 连接的方式,指定一个矩形单元格区域。 区域包含起止两个端点。 如果两个单元格都在当前行,你可以直接写成 ‘$2..$7’ ; 但如果至少有一个单元格在其他行,则至少第一个单元格需要使用完整的 ‘@ROW$COLUMN’ 格式, 即引用必须以 ‘@’ 开头才能被正确解析。示例:
| ‘$1..$3’ | 当前行前三个单元格 |
| ‘$P..$Q’ | 使用列名的区域(参见 Advanced features) |
| ‘$<<<..$>>’ | 从第三列开始到倒数第二列 |
| ‘@2$1..@4$3’ | 两个单元格之间的 9 个单元格(等同于 ‘A2..C4’ ) |
| ‘@-1$-2..@-1’ | 上一行从左数第二列开始的三个单元格 |
| ‘@I..II’ | 第一条与第二条分隔线之间,是 ‘@I..@II’ 的简写 |
区域引用会返回一个数值向量,可直接传入 Calc 的向量函数。 区域中的空单元格通常会被忽略,因此向量只包含非空单元格。 关于模式开关 ‘E=、=N’ 及其他选项与示例,参见 Formula syntax for Calc。
在执行 Calc 公式和 Lisp 公式时,最先执行的操作之一就是将公式中的 ‘@#’ 和 ‘$#’
替换为当前结果单元格所在的行号和列号。
传统 Lisp 公式中对应的变量是 org-table-current-dline 和 ~org-table-current-column~。
示例:
奇数行显示列号,偶数行清空单元格。
将名为 FOO 的表格中每一行第一列的文本或数值, 复制到当前表格的第二列。
将名为 FOO 的表格中第一行每一列的值翻倍后, 写入当前表格的第三行。
第二、第三个示例中,表格 FOO 的行/列数至少要与当前表格相同。 注意这种方式效率较低19,不适用于大量行。
‘$name’ 会被解析为列名、参数或常量。
常量可以通过变量 org-table-formula-constants 全局定义,
也可以在文件内通过如下形式的行局部定义:
#+CONSTANTS: c=299792458. pi=3.14 eps=2.4e-6
此外,属性(参见 Properties and Columns)也可作为表格公式中的常量: 对于属性 ‘Xyz’ ,可使用名称 ‘$PROP_Xyz’ , 系统会在当前大纲条目及上层层级中查找该属性。 如果你安装了 ‘constants.el’ 包,它也会被用于解析常量, 包括自然常数如 ‘$h’ 表示普朗克常数,以及单位如 ‘$km’ 表示千米20。 列名和参数可以在特殊的表格行中指定,详见下文 Advanced features。 所有名称必须以字母开头,后续可由字母和数字组成。
你还可以引用当前文件甚至其他文件中另一张表格的常量、单元格和区域。 语法为:
remote(NAME,REF)
其中 NAME 可以是当前文件中某张表格的名称, 由表格前的 ‘#+NAME:’ 行设定;也可以是某个条目的 ID(即便在其他文件中), 此时引用指向该条目中的第一张表格。 REF 是上文所述的绝对单元格或区域引用, 例如 ‘@3$3’ 或 ‘$somename’ ,在被引用表格中有效。
当 NAME 格式为 ‘@ROW$COLUMN’ 时, 会被替换为当前表格该单元格中的名称或 ID。 例如 ‘remote($1, @@>$2)’ ⇒ ‘remote(year_2013, @@>$1)’ 。 不支持 ‘B3’ 格式,因为无法与普通表格名或 ID 区分。
Org 可识别用户输入的 ‘B4’ 格式引用,但在提供可编辑公式时不会使用该语法。可通过变量 org-table-use-standard-references 自定义此行为。
计算时间复杂度为 O(N^2), 因为每个待复制单元格都要重新解析一次 FOO
文件 ‘constants.el’ 可提供两种单位制下的常量值: ‘SI’ 与 ‘cgs’ 。具体使用哪种取决于变量 constants-unit-system 。可通过 ‘STARTUP’ 选项 ‘constSI’ 与 ‘constcgs’ 为当前框架设置该值。