org export时,是否可以根据org文件内容动态选择样式?

比如,我有两个导出HTML的样式(CSS+JS),一个适合带TOC的,一个适合不带TOC的,是否可能在导出时自动判断org文件中是否包含 toc:nil ,来动态选择采用哪个样式?

应该是可以的。不太熟悉 Org mode,刚刚想到一个比较局限的方法(把下面的 Org 代码块插入 Org 文档,Org 导出时会执行它,搜索是否有 toc:nil,根据结果插入不同的 CSS 文件),不知道有帮助没有。

#+BEGIN_SRC emacs-lisp :results raw :exports results
  (if (save-excursion
        (goto-char (point-min))
        (re-search-forward
         (rx line-start "#+OPTIONS:" (1+ not-newline) "toc:nil")
         nil :no-error))
      "#+HTML_HEAD: <link rel=\"stylesheet\" type=\"text/css\" href=\"without-toc.css\" />"
    "#+HTML_HEAD: <link rel=\"stylesheet\" type=\"text/css\" href=\"with-toc.css\" />")
#+END_SRC

多谢啦。但是我想要的是个通用的,即不是在文档里的

不是在 Org 文档的话里就更不“通用”(这里指的是可以指定任意的 CSS 和 JS 文件)吧?

假如有这个功能的话,你所期望的使用方式是什么?

我看可以写一个函数,先检查有没有制定 CSS,再根据 toc 插入 CSS,然后把这个函数 hook 到导出命令上

不放到 Org 文件中的话,这是另外一种方法(注:判断是否有 toc 的方法依旧可能不可靠,估计有更为准确的判断方法)

(defun chunyang-org-html-setup-css (back-end)
  "根据 toc 设置不同的 CSS 文件."
  (when (eq back-end 'html)
    (if (save-excursion
          (goto-char (point-min))
          (re-search-forward
           (rx line-start "#+OPTIONS:" (1+ not-newline) "toc:nil")
           nil :no-error))
        (insert "#+HTML_HEAD: <link rel=\"stylesheet\" href=\"/没有TOC的.css\">" "\n")
      (insert "#+HTML_HEAD: <link rel=\"stylesheet\" href=\"/有TOC的.css\">" "\n"))))

(add-hook 'org-export-before-processing-hook #'chunyang-org-html-setup-css)
1 个赞

我记得是用 org-export-with-toc 这个 boolean 来控制的。

org-export-with-toc 是全局变量,org文档里的 toc:nil 是局部变量,不一样。

多谢了多谢了!!