本来一个 table 要想导出为三线表, 它得本来就有 3 个 hlines, 就像:
|---+---+---|
| A | B | C |
|---+---+---|
| 1 | 2 | 3 |
| 4 | 5 | 6 |
|---+---+---|
但 R/python babel 的返回作为 table 通常只有 1 个线, 就是第二行的 hline, 或者没有线.
这个链接 通过改代码来得到三线表, 但我觉得不是好的做法, 因为导出的时候我总是需要三线表, 如果通过改代码得到三线表, 所有输出表格的代码块都得改. 我觉得更好的做法是平时不得到三线表, 只在导出时控制得到三线表. 似乎我可以通过改 latex 对应 table 的处理, 但请问有没有比这个优雅一点的方式, 比如通过 org 内置选项之类的?
2 个赞
我想到一个办法, 直接对 tex 文件进行后处理, 识别 table 环境, 加上 \hline
.
找到一个办法,效果如下,是在C-c C-c
的时候直接生成三线表
应该和你需求一样吧,你可以试试。用到了 advice
,有可能会影响其它地方
(defun orgtbl-hook (args)
(let ((table (car args)))
(list (nconc (list 'hline (car table) 'hline)
(cdr table)
(list 'hline))
(nth 2 args))))
(advice-add 'orgtbl-to-orgtbl :filter-args #'orgtbl-hook)
1 个赞
完美解决, 可否请教您是怎么知道应该改 orgtbl-to-orgtbl 的呢?
-
describe-key
确认调用的是 org-ctrl-c-ctrl-c
;; org-ctrl-c-ctrl-c 中
((or `inline-src-block `src-block)
(unless org-babel-no-eval-on-ctrl-c-ctrl-c
(org-babel-eval-wipe-error-buffer)
(org-babel-execute-src-block
current-prefix-arg (org-babel-get-src-block-info nil context))))
- 调用了
org-babel-execute-src-block
(org-babel-insert-result
result result-params info new-hash lang
(time-subtract (current-time) exec-start-time))))
- 在
org-babel-execute-src-block
最后调用 org-babel-insert-result
插入结果
;; Try hard to print RESULT as a table. Give up if
;; it contains an improper list.
((funcall tabulablep result)
(goto-char beg)
(insert (concat (orgtbl-to-orgtbl
(if (cl-every
(lambda (e)
(or (eq e 'hline) (listp e)))
result)
result
(list result))
nil)
"\n"))
(goto-char beg)
(when (org-at-table-p) (org-table-align))
(goto-char (org-table-end)))
- 最后看了一下
orgtbl-to-orgtbl
的文档以及源码,所以选择 advice
的方式修改入参 table
的数据,相应的位置插入 'hline
即可
2 个赞