org export 如何将 table 自动导出为三线表?

本来一个 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的时候直接生成三线表

image

应该和你需求一样吧,你可以试试。用到了 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 的呢?

  1. 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))))
  1. 调用了 org-babel-execute-src-block
(org-babel-insert-result
 result result-params info new-hash lang
 (time-subtract (current-time) exec-start-time))))
  1. 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)))
  1. 最后看了一下 orgtbl-to-orgtbl 的文档以及源码,所以选择 advice 的方式修改入参 table 的数据,相应的位置插入 'hline 即可
2 个赞