根据主题设置组织导出的<code>块的背景


24

我经常导出组织模式文件,并且几乎所有文件中都有代码。当我导出代码时,最终会根据主题为文本着色,但是,我会定期在深色主题和浅色主题之间切换。对于浅色主题,这些<code>块需要具有浅色背景,对于深色主题,它们需要具有深色背景(否则,我最终在浅灰色背景上显示浅黄色文本,这是不可读的)。

我必须为深色背景添加此行:

#+HTML_HEAD: <style>pre.src {background-color: #303030; color: #e5e5e5;}</style>

然后记得在我切换到浅色背景时将其删除

有没有一种方法可以在导出时自动检测当前主题的背景色,并将其用于导出的HTML的CSS中?

编辑

我使用Jordon的答案(感谢Jordon,您得到了业障积分!),但是我想发布最终添加到我的代码中的解决方案,因为它是他的答案的稍微修改后的版本:

(defun my/org-inline-css-hook (exporter)
  "Insert custom inline css to automatically set the
background of code to whatever theme I'm using's background"
  (when (eq exporter 'html)
    (let* ((my-pre-bg (face-background 'default))
           (my-pre-fg (face-foreground 'default)))
      (setq
       org-html-head-extra
       (concat
        org-html-head-extra
        (format "<style type=\"text/css\">\n pre.src {background-color: %s; color: %s;}</style>\n"
                my-pre-bg my-pre-fg))))))

(add-hook 'org-export-before-processing-hook 'my/org-inline-css-hook)

这不仅设置了背景色,还设置了前景色。还将行添加到现有org-html-head-extra设置,这样就不会意外覆盖其他HTML。我已经测试过,这对我非常有用!


1
我敢肯定有办法,但是在导出时始终执行相同的主题会更好吗?还是您有意导出具有不同主题的商品?
马拉巴巴

@Malabarba的目的是能够导出我当前正在使用的任何主题,并使代码可读。由于许多主题不能干净地切换(即使使用disable-theme),因此我不想为了导出HTML而不得不用单独的主题重新启动Emacs,我每天要这样做多次。
李H

1
如果我理解正确,则您当前的设置已经在代码块上使用了主题的颜色,而您遇到的问题是未使用主题的背景。如果我弄错了,请随时回滚对标题所做的编辑。
马拉巴巴

@Malabarba我当前的设置未指定代码块的背景色(尽管我可以在CSS中将背景色硬编码,如果有帮助的话)。我希望将主题的背景色用于组织模式代码块。新标题对我有用。
李H

上述解决方案有两个问题。首先,“ gray80”之类的颜色将无法正确转换为CSS值,也不会被设置。其次,每次导出org-html-head-extra都将附加到导出中,导致无限制的增长,尽管样式的功能不会受到损害。
RP狄龙2015年

Answers:


10

首先,我相信org可以htmlize根据您的主题自动为您的源代码块着色。

或者。

查看http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/。它有一个很好的示例,说明了如何org-export-before-processing-hook在HTML导出之前使用来将自定义CSS扔到组织文档上。

如果站点关闭,下面是代码:

在html导出的此处,org将在当前目录中查找名为styles.css的文件,或在.emacs.d目录中查找默认文件,然后将该CSS注入文档中。这很好,但对于您的用例而言并不完美。

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let* ((dir (ignore-errors (file-name-directory (buffer-file-name))))
           (path (concat dir "style.css"))
           (homestyle (or (null dir) (null (file-exists-p path))))
           (final (if homestyle "~/.emacs.d/org-style.css" path)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head (concat
                           "<style type=\"text/css\">\n"
                           "<!--/*--><![CDATA[/*><!--*/\n"
                           (with-temp-buffer
                             (insert-file-contents final)
                             (buffer-string))
                           "/*]]>*/-->\n"
                           "</style>\n")))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

您可以通过几种方式对其进行自定义,以使其按您希望的方式工作。

一种方法是根据您的主题手动构建css并将其插入。

这是修改后的版本,将的背景设置pre.src为默认faces:background属性的十六进制值。

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let ((my-pre-bg (face-background 'default)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head
            (format "<style type=\"text/css\">\n pre.src { background-color: %s;}</style>\n" my-pre-bg)))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

1
谢谢乔登,太好了!我已经用经过稍微编辑的版本更新了原始问题,但是您会得到赏金和解决方案!
李H
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.